interconnect: qcom: add MSM8x60 NoC driver
Subsystems (3)
v2 cover interconnect: qcom: add MSM8x60 NoC driver
v2 addresses Jie's, Sashiko's and Dmitry's review of v1:
Binding (PATCH 1/2):
- Add the dt-binding schema (qcom,msm8660.yaml). v1 only shipped the ID header (Jie flagged the missing schema). The schema covers all four compatibles, per-fabric clock-name lists (bus/bus_a/ebi1/ebi1_a for AFAB; bus/bus_a/smi/smi_a for MMFAB; bus/bus_a for SFAB and DFAB) with descriptions for each clock (Dmitry), the required qcom,rpm phandle, and #interconnect-cells = <1>.
- Drop the SFPB/CFPB mention from the header commit message; those fabrics aren't modelled by the driver (Sashiko Low).
Driver (PATCH 2/2):
- Fix the bandwidth aggregation in msm8660_icc_set() (Sashiko High). v1 walked provider->nodes and re-summed n->avg_bw across all nodes, which double-counts: the framework already writes each path's bw to every node it traverses, so summing here gives e.g. master_bw + slave_bw for the same flow. v2 takes the max per-node rate across the provider (matches the qcom_icc_bus_aggregate() convention in icc-rpm.c).
- Switch to dynamic ICC node IDs via icc_node_create_dyn() and pointer-based linking via icc_link_nodes(), matching the icc-rpmh-style pattern (Dmitry). Drop the internal MSM8660_* enum entirely; struct msm8660_icc_node now carries a struct icc_node *node and a flexible link_nodes[] array of qnode pointers.
- Expand the DEFINE_QNODE macro (Dmitry); each of the 63 qnodes is now an explicit static struct definition, with forward declarations grouped at the top.
- Use dev_err_ptr_probe() in msm8660_get_rpm()'s deferred-probe paths (Dmitry).
- Limit the clock-bulk-get fallback to -ENOENT only (Dmitry); propagate every other error including -EPROBE_DEFER instead of "any non-DEFER continues without clock scaling".
- Kconfig: depend on MFD_QCOM_RPM=y so a built-in interconnect provider can't link against a modular RPM (Sashiko Low).
- struct msm8660_icc_node: const char *name (Sashiko Low).
On-device validation (HP TouchPad / APQ8060):
All four fabric providers probe cleanly:
qnoc-msm8660 soc:interconnect@0: RPM fabric ARB enabled
(4 masters, 4 slaves, 2 tiered) [AFAB]
qnoc-msm8660 soc:interconnect@1: RPM fabric ARB enabled
(17 masters, 9 slaves, 2 tiered) [SFAB]
qnoc-msm8660 soc:interconnect@2: RPM fabric ARB enabled
(14 masters, 4 slaves, 3 tiered) [MMFAB]
qnoc-msm8660 soc:interconnect@3: MSM8660 interconnect provider
registered [DFAB]
mmcc-msm8660: MMSS fabric: unhalted all master ports (0-13) msm_hsusb 12500000.usb: USB HS: Setting interconnect
bandwidth avg=61440 peak=61440 kBps
interconnect_summary shows the expected per-node aggregation (e.g. slv_ebi_ch0 sums MMC + MDP + DMA + USB consumer requests) and msm8660_icc_set() then derives a single fabric clock rate from the per-node max rather than the per-node sum (the v1 double-count is gone in v2).
The companion DTS patches that enable the providers for the HP TouchPad will be sent separately to the ARM/DTS tree.
Herman van Hazendonk (2):
dt-bindings: interconnect: qcom: add msm8660 NoC
interconnect: qcom: add MSM8x60 NoC driver
.../bindings/interconnect/qcom,msm8660.yaml | 157 ++ drivers/interconnect/qcom/Kconfig | 14 + drivers/interconnect/qcom/Makefile | 2 + drivers/interconnect/qcom/msm8660.c | 1619 +++++++++++++++++ .../dt-bindings/interconnect/qcom,msm8660.h | 156 ++ 5 files changed, 1948 insertions(+) create mode 100644 Documentation/devicetree/bindings/interconnect/qcom,msm8660.yaml create mode 100644 drivers/interconnect/qcom/msm8660.c create mode 100644 include/dt-bindings/interconnect/qcom,msm8660.h
base-commit: 944125b4c454b58d2fe6e35f1087a932b2050dff
Signature · 1 line
2.43.0
PATCH v2 1/2 dt-bindings: interconnect: qcom: add msm8660 NoC
Add a dt-binding schema and an interconnect master/slave ID header for the MSM8x60 family (MSM8260/MSM8660/APQ8060) Network-on-Chip. The chip exposes four NoC fabrics that the qnoc-msm8660 driver models:
AFAB - Applications fabric (Scorpion CPU + L2) SFAB - System fabric (DMA, SPS, security)
MMFAB - Multimedia fabric (MDP, GPU, camera, video, rotator) DFAB - Daytona fabric (SDC, ADM master/slave)
The schema covers all four compatible strings, per-fabric clock-name lists (bus / bus_a / ebi1 / ebi1_a for AFAB; bus / bus_a / smi / smi_a for MMFAB; bus / bus_a for SFAB and DFAB), the required qcom,rpm phandle through which the provider hands the arbitration buffer to RPM firmware, and #interconnect-cells = <1>.
The ID header lists per-fabric master / slave / gateway indices derived from the legacy vendor msm_bus_board_8660.c enums, normalised to the upstream interconnect-framework naming convention.
--- .../bindings/interconnect/qcom,msm8660.yaml | 157 ++++++++++++++++++ .../dt-bindings/interconnect/qcom,msm8660.h | 156 +++++++++++++++++ 2 files changed, 313 insertions(+) create mode 100644 Documentation/devicetree/bindings/interconnect/qcom,msm8660.yaml create mode 100644 include/dt-bindings/interconnect/qcom,msm8660.h
Documentation/devicetree/bindings/interconnect/qcom,msm8660.yaml new file +157 -0
@@ -0,0 +1,157 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/interconnect/qcom,msm8660.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Qualcomm MSM8x60 family Network-On-Chip interconnect + +maintainers: + - Herman van Hazendonk <[email protected]> + +description: | + The Qualcomm MSM8x60 family (MSM8260/MSM8660/APQ8060) NoC is split into + four fabrics, each modelled as a separate interconnect provider: + + APPSS fabric Scorpion CPU cluster, L2 cache, EBI (DDR) memory. + System fabric DMA controllers, modem and LPASS cross-domain links, + security peripherals. + Multimedia fab Display (MDP), GPU, camera (VFE), video codec (VPE), + JPEG, with the SMI scratchpad as the local slave. + Daytona fabric SDC1..SDC5 controllers and ADM master/slave channels. + + Each provider programs fabric arbitration (per-master priority tier and + per-slave bandwidth vote) through RPM firmware via the qcom,rpm parent + controller, in addition to scaling its bus clocks via clk_set_rate. + +properties: + compatible: + enum: + - qcom,msm8660-apps-fabric + - qcom,msm8660-system-fabric + - qcom,msm8660-mmss-fabric + - qcom,msm8660-daytona-fabric + + clocks: + minItems: 2 + maxItems: 4 + + clock-names: + minItems: 2 + maxItems: 4 + + qcom,rpm: + $ref: /schemas/types.yaml#/definitions/phandle + description: + Phandle to the qcom,rpm node. The interconnect provider hands the + per-fabric arbitration buffer to RPM firmware through this resource, + so a production device tree must point at the system RPM. + +required: + - compatible + - clocks + - clock-names + - qcom,rpm + - '#interconnect-cells' + +allOf: + - $ref: qcom,rpm-common.yaml# + - if: + properties: + compatible: + const: qcom,msm8660-apps-fabric + then: + properties: + clocks: + items: + - description: APPSS fabric bus clock (active vote) + - description: APPSS fabric bus clock (active+sleep vote) + - description: EBI1 (DDR) channel clock (active vote) + - description: EBI1 (DDR) channel clock (active+sleep vote) + clock-names: + items: + - const: bus + - const: bus_a + - const: ebi1 + - const: ebi1_a + - if: + properties: + compatible: + enum: + - qcom,msm8660-system-fabric + - qcom,msm8660-daytona-fabric + then: + properties: + clocks: + items: + - description: Fabric bus clock (active vote) + - description: Fabric bus clock (active+sleep vote) + clock-names: + items: + - const: bus + - const: bus_a + - if: + properties: + compatible: + const: qcom,msm8660-mmss-fabric + then: + properties: + clocks: + items: + - description: MMSS fabric bus clock (active vote) + - description: MMSS fabric bus clock (active+sleep vote) + - description: SMI scratchpad clock (active vote) + - description: SMI scratchpad clock (active+sleep vote) + clock-names: + items: + - const: bus + - const: bus_a + - const: smi + - const: smi_a + +unevaluatedProperties: false + +examples: + - | + #include <dt-bindings/clock/qcom,rpmcc.h> + + interconnect-afab { + compatible = "qcom,msm8660-apps-fabric"; + clocks = <&rpmcc RPM_APPS_FABRIC_CLK>, + <&rpmcc RPM_APPS_FABRIC_A_CLK>, + <&rpmcc RPM_EBI1_CLK>, + <&rpmcc RPM_EBI1_A_CLK>; + clock-names = "bus", "bus_a", "ebi1", "ebi1_a"; + qcom,rpm = <&rpm>; + #interconnect-cells = <1>; + }; + + interconnect-sfab { + compatible = "qcom,msm8660-system-fabric"; + clocks = <&rpmcc RPM_SYS_FABRIC_CLK>, + <&rpmcc RPM_SYS_FABRIC_A_CLK>; + clock-names = "bus", "bus_a"; + qcom,rpm = <&rpm>; + #interconnect-cells = <1>; + }; + + interconnect-mmfab { + compatible = "qcom,msm8660-mmss-fabric"; + clocks = <&rpmcc RPM_MM_FABRIC_CLK>, + <&rpmcc RPM_MM_FABRIC_A_CLK>, + <&rpmcc RPM_SMI_CLK>, + <&rpmcc RPM_SMI_A_CLK>; + clock-names = "bus", "bus_a", "smi", "smi_a"; + qcom,rpm = <&rpm>; + #interconnect-cells = <1>; + }; + + interconnect-dfab { + compatible = "qcom,msm8660-daytona-fabric"; + clocks = <&rpmcc RPM_DAYTONA_FABRIC_CLK>, + <&rpmcc RPM_DAYTONA_FABRIC_A_CLK>; + clock-names = "bus", "bus_a"; + qcom,rpm = <&rpm>; + #interconnect-cells = <1>; + }; +...
include/dt-bindings/interconnect/qcom,msm8660.h new file +156 -0
156 lines not on this page · raw message
Signature · 1 line
2.43.0
[email protected]
AI reviewRe: [PATCH v2 1/2] dt-bindings: interconnect: qcom: add msm8660 NoC
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [Medium] The `#interconnect-cells` property is omitted from the top-level `properties` block and lacks a…
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] The #interconnect-cells property is omitted from the top-level properties block and lacks a const: 1 constraint. --
commit 6d4f0512e52e66a4b578ad649862cfd9451407db
Author: Herman van Hazendonk <[email protected]>
dt-bindings: interconnect: qcom: add msm8660 NoC
This commit introduces a device tree binding schema and interconnect ID header for the Qualcomm MSM8x60 family Network-on-Chip. It defines four fabric compatible strings, per-fabric clock requirements, and the necessary RPM phandle to pass arbitration data to the firmware.
Quoted 5 lines
Documentation/devicetree/bindings/interconnect/qcom,msm8660.yaml new file +0
-0
[ ... ]
Documentation/devicetree/bindings/interconnect/qcom,msm8660.yaml line 33
Quoted 7 lines
Documentation/devicetree/bindings/interconnect/qcom,msm8660.yaml new file +7
-0+properties: + compatible: + enum: + - qcom,msm8660-apps-fabric + - qcom,msm8660-system-fabric + - qcom,msm8660-mmss-fabric + - qcom,msm8660-daytona-fabric
[Severity: Medium]
Should #interconnect-cells be explicitly defined in this top-level properties block with a const: 1 constraint?
The inherited common schema (qcom,rpm-common.yaml) permissively allows both 1 and 2 cells, but the MSM8660 interconnect strictly uses 1 cell.
Omitting the const: 1 constraint allows invalid device tree configurations to silently pass schema validation, and it appears to conflict with the subsystem guideline requiring that each cell-count property must have an explicit const constraint matching the hardware.
Quoted 4 lines
Documentation/devicetree/bindings/interconnect/qcom,msm8660.yaml new file +4
-0+ + clocks: + minItems: 2 + maxItems: 4
Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=1
PATCH v2 2/2 interconnect: qcom: add MSM8x60 NoC driver
In reply to Herman van HazendonkAdd a Qualcomm interconnect driver for the MSM8x60 family modelling the four NoC fabrics (APPSS, System, MMSS, Daytona) that connect masters and slaves on these Scorpion-class SoCs. The driver implements the interconnect-provider API to manage bandwidth between specific masters and slaves via the RPM arbitration tables.
Each fabric carries:
- A bus clock (managed via clk_bulk APIs) whose rate is the maximum per-node rate across the provider, following the icc-rpm.c convention. Summing all provider nodes would overcount, because the framework writes each path's bandwidth onto every node it traverses; taking the max picks the hottest single node, which is the correct fabric throughput requirement. A minimum floor of 384 MHz keeps the bus alive during concurrent USB and MDP activity (266 MHz was empirically insufficient).
- An RPM arbitration buffer (arb / bwsum) that the RPM firmware consumes via its shared-memory protocol; commits go via the qcom-rpm driver's set_resource API.
Nodes follow the icc-rpmh-style pattern: each qnode is a static struct with a flexible link_nodes[] array of qnode pointers, ICC IDs are assigned dynamically via icc_node_create_dyn(), and links are established with icc_link_nodes() at probe time. The dt-bindings header IDs remain per-fabric indices into the of_icc_xlate_onecell data array.
msm8660_get_rpm() pins the supplier with device_link_add() before reading drvdata so an unbind/rebind window cannot leave a stale qcom_rpm pointer; the EPROBE_DEFER paths route through dev_err_ptr_probe() for proper deferred-probe accounting. clk_bulk_prepare_enable() is paired with a devm_add_action_or_reset() cleanup so an EPROBE_DEFER from the RPM lookup does not leak the prepare/enable refcount across retries. The fabric rate cap uses min_t(u64,...) so a bandwidth request exceeding 4 GiB/s cannot wrap through u32 truncation into a near-zero clock rate that would halt the interconnect.
--- drivers/interconnect/qcom/Kconfig | 14 + drivers/interconnect/qcom/Makefile | 2 + drivers/interconnect/qcom/msm8660.c | 1619 +++++++++++++++++ .../dt-bindings/interconnect/qcom,msm8660.h | 6 +- 4 files changed, 1638 insertions(+), 3 deletions(-) create mode 100644 drivers/interconnect/qcom/msm8660.c
drivers/interconnect/qcom/Kconfig +14 -0
@@ -80,6 +80,20 @@ config INTERCONNECT_QCOM_MSM8953 This is a driver for the Qualcomm Network-on-Chip on msm8953-based platforms. +config INTERCONNECT_QCOM_MSM8660 + # bool, not tristate: this provider must be registered at + # core_initcall to be ready before icc_init (subsys_initcall) walks + # devicetree consumers; a loadable module cannot satisfy that + # ordering. Build-in only. + bool "Qualcomm MSM8x60 interconnect driver" + depends on INTERCONNECT_QCOM=y + depends on MFD_QCOM_RPM=y + help + This is a driver for the Qualcomm fabric-based bus interconnect + on MSM8x60 family (MSM8260/MSM8660/APQ8060) platforms (e.g., HP TouchPad). + The driver manages APPSS, System, and MMSS fabrics and sends + per-port bandwidth arbitration requests to RPM firmware. + config INTERCONNECT_QCOM_MSM8974 tristate "Qualcomm MSM8974 interconnect driver" depends on INTERCONNECT_QCOM
drivers/interconnect/qcom/Makefile +2 -0
@@ -13,6 +13,7 @@ qnoc-msm8916-objs := msm8916.o qnoc-msm8937-objs := msm8937.o qnoc-msm8939-objs := msm8939.o qnoc-msm8953-objs := msm8953.o +qnoc-msm8660-objs := msm8660.o qnoc-msm8974-objs := msm8974.o qnoc-msm8976-objs := msm8976.o qnoc-msm8996-objs := msm8996.o
@@ -58,6 +59,7 @@ obj-$(CONFIG_INTERCONNECT_QCOM_MSM8916) += qnoc-msm8916.o obj-$(CONFIG_INTERCONNECT_QCOM_MSM8937) += qnoc-msm8937.o obj-$(CONFIG_INTERCONNECT_QCOM_MSM8939) += qnoc-msm8939.o obj-$(CONFIG_INTERCONNECT_QCOM_MSM8953) += qnoc-msm8953.o +obj-$(CONFIG_INTERCONNECT_QCOM_MSM8660) += qnoc-msm8660.o obj-$(CONFIG_INTERCONNECT_QCOM_MSM8974) += qnoc-msm8974.o obj-$(CONFIG_INTERCONNECT_QCOM_MSM8976) += qnoc-msm8976.o obj-$(CONFIG_INTERCONNECT_QCOM_MSM8996) += qnoc-msm8996.o
drivers/interconnect/qcom/msm8660.c new file +1619 -0
1,619 lines not on this page · raw message
include/dt-bindings/interconnect/qcom,msm8660.h +3 -3
@@ -4,7 +4,7 @@* * Copyright (c) 2026 Herman van Hazendonk <[email protected]> * -* Based on webOS kernel msm_bus_board_8660.c +* Based on legacy vendor kernel msm_bus_board_8660.c * Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved. */
@@ -79,11 +79,11 @@* Daytona Fabric (DFAB) - Peripheral bus * * DFAB connects slower peripherals (SDCC, ADM DMA) to the system fabric. -* The webOS kernel managed DFAB bandwidth via voter clocks (dfab_sdc*_clk, +* The legacy vendor kernel managed DFAB bandwidth via voter clocks (dfab_sdc*_clk, * dfab_usb_hs_clk). In mainline, this is handled by the interconnect framework. * * USB HS is included as a DFAB voter for compatibility with the legacy clock -* voting mechanism. The webOS kernel comment said: "if usb link is in sps +* voting mechanism. The legacy vendor kernel comment said: "if usb link is in sps * there is no need for usb pclk as daytona fabric clock will be used instead". * This keeps DFAB clock stable when USB is active. */
Signature · 1 line
2.43.0
[email protected]
AI reviewThank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider: - [Critical] State persistence in static structures causing use-after-free and permanent probe failures on…
Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [Critical] State persistence in static structures causing use-after-free and permanent probe failures on retry/rebind.
- [High] Manual removal of a managed device link causing reference count double-drop.
- [High] Ignored return value from icc_link_nodes() memory allocation.
- [Low] Dead code due to incorrect fallback checking of devm_clk_bulk_get_optional() return value. --
commit 409fc3daaab0214cd873901a825998159cc133c8
Author: Herman van Hazendonk <[email protected]>
Subject: interconnect: qcom: add MSM8x60 NoC driver
This commit adds a Qualcomm interconnect driver for the MSM8x60 family modeling the four NoC fabrics (APPSS, System, MMSS, Daytona). The driver manages bandwidth via RPM arbitration and fabric clocks, and registers the provider at core_initcall.
Quoted 4 lines
drivers/interconnect/qcom/msm8660.c new file +0
-0
[ ... ]
Quoted 1 line
drivers/interconnect/qcom/msm8660.c new file +0
-0@@ -1321,79 +1321,80 @@ static struct qcom_rpm *msm8660_get_rpm(struct device *dev)
[ ... ]
Quoted 6 lines
drivers/interconnect/qcom/msm8660.c new file +6
-0+ link =device_link_add (dev, &rpm_pdev->dev, +DL_FLAG_AUTOREMOVE_CONSUMER ); +put_device (&rpm_pdev->dev); +if (!link) +return dev_err_ptr_probe (dev, -EPROBE_DEFER , +"failed to add device link to RPM\n" );
drivers/interconnect/qcom/msm8660.c line 1364
Quoted 10 lines
drivers/interconnect/qcom/msm8660.c new file +10
-0+ +/* +* Safe to read drvdata now: the device link pins the supplier so +* it cannot be unbound until our consumer (this interconnect +* provider) is unbound first. +*/ + rpm =dev_get_drvdata (&rpm_pdev->dev); +if (!rpm) { +device_link_remove (dev, &rpm_pdev->dev); + return dev_err_ptr_probe(dev, -EPROBE_DEFER,
[Severity: High]
Since this device link is created with DL_FLAG_AUTOREMOVE_CONSUMER, the driver core will automatically manage its lifecycle and clean it up when probe fails.
Does manually calling device_link_remove() here before deferring the probe cause a double-put and potentially a use-after-free regression when the driver core subsequently attempts its own cleanup?
Quoted 8 lines
drivers/interconnect/qcom/msm8660.c new file +8
-0+ "RPM not ready\n"); + } + +return rpm; +} + +static int msm8660_icc_probe (struct platform_device *pdev) +{
[ ... ]
drivers/interconnect/qcom/msm8660.c line 1418
Quoted 11 lines
drivers/interconnect/qcom/msm8660.c new file +11
-0+/* +* MSM8660 fabric clocks are managed by RPM firmware and may not be +* available in mainline Linux yet. Once the clock provider exists, +* we want to honour it; until then we run without per-fabric clock +* scaling. Only swallow -ENOENT (the clock provider exists but has +* no matching entry); propagate every other error including +* -EPROBE_DEFER (the provider exists but has not finished probing). +*/ + ret =devm_clk_bulk_get_optional (dev, qp->num_clks, qp->bus_clks); +if (ret == -ENOENT ) { +dev_warn (dev,"bus clocks not registered, continuing without clock scaling\n" );
[Severity: Low]
Since devm_clk_bulk_get_optional() evaluates missing optional clocks as non-fatal and intentionally returns 0 (success) instead of -ENOENT, is this ret == -ENOENT check dead code?
Quoted 4 lines
drivers/interconnect/qcom/msm8660.c new file +4
-0+ qp->num_clks =0 ; + }else if (ret) { +return ret; + }
[ ... ]
drivers/interconnect/qcom/msm8660.c line 1514
Quoted 9 lines
drivers/interconnect/qcom/msm8660.c new file +9
-0+for (i =0 ; i < num_nodes; i++) { +size_t j; + +if (!qnodes[i]) +continue ; + +if (!qnodes[i]->node) + qnodes[i]->node =icc_node_create_dyn (); + node = qnodes[i]->node;
[Severity: Critical]
The interconnect nodes are dynamically allocated via icc_node_create_dyn() and assigned to the ->node field of the statically allocated, global msm8660_icc_node structs.
If the driver fails to probe later and the error path calls icc_nodes_remove(), the dynamically allocated memory is freed but the static pointers are not reset to NULL.
On a subsequent probe retry or rebind, if (!qnodes[i]->node) will evaluate to false. Will this cause the driver to pass dangling pointers (or an ERR_PTR if the allocation originally failed) to the interconnect framework, leading to a use-after-free regression?
Quoted 6 lines
drivers/interconnect/qcom/msm8660.c new file +6
-0+if (IS_ERR (node)) { + ret =PTR_ERR (node); + goto err_remove_nodes; + } + + ret =icc_node_set_name (node, provider, qnodes[i]->name);
drivers/interconnect/qcom/msm8660.c line 1530
Quoted 10 lines
drivers/interconnect/qcom/msm8660.c new file +10
-0+if (ret) { +icc_node_destroy (node->id); + goto err_remove_nodes; + } + + node->data = qnodes[i]; +icc_node_add (node, provider); + +for (j =0 ; j < qnodes[i]->num_links; j++) +icc_link_nodes (node, &qnodes[i]->link_nodes[j]->node);
[Severity: High]
Can icc_link_nodes() fail with -ENOMEM under memory pressure?
If the return value is ignored, could a failed allocation result in a silently disconnected topology graph that causes routing failures at runtime?
Quoted 16 lines
drivers/interconnect/qcom/msm8660.c new file +16
-0+ + data->nodes[i] = node; + } + + ret =icc_provider_register (provider); +if (ret) + goto err_remove_nodes; + +platform_set_drvdata (pdev, qp); + +dev_info (dev,"MSM8660 interconnect provider registered\n" ); + +return 0 ; + +err_remove_nodes: +icc_nodes_remove (provider);
Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=2