Commit be0df73d authored by Georgi Djakov's avatar Georgi Djakov
Browse files

Merge branch 'icc-msm8974' into icc-next

Commit d6edc31f ("clk: qcom: smd-rpm: Separate out interconnect bus
clocks") moved control over several RPM resources from the clk-smd-rpm
driver to the icc-rpm.c interconnect helpers. Most of the platforms were
fixed before that commit or shortly after. However the MSM8974 was left
as a foster child in broken state. Fix the loose ends and reenable
interconnects on that platform.

* icc-msm8974
  dt-bindings: interconnect: qcom,msm8974: drop bus clocks
  dt-bindings: interconnect: qcom,msm8974: use qcom,rpm-common
  interconnect: qcom: drop unused is_on flag
  interconnect: qcom: icc-rpm: allow overwriting get_bw callback
  interconnect: qcom: define OCMEM bus resource
  interconnect: qcom: let platforms declare their bugginess
  interconnect: qcom: msm8974: switch to the main icc-rpm driver
  interconnect: qcom: msm8974: expand DEFINE_QNODE macros

Link: https://msgid.link/20260324-msm8974-icc-v2-0-527280043ad8@oss.qualcomm.com


Tested-by: default avatarAlexandre Messier <alex@me.ssier.org>
Tested-by: Luca Weiss <luca.weiss@fairphone.com> # fairphone-fp2
Signed-off-by: default avatarGeorgi Djakov <djakov@kernel.org>
parents 9bc3b976 39ecfef4
Loading
Loading
Loading
Loading
+16 −12
Original line number Diff line number Diff line
@@ -26,27 +26,34 @@ properties:
      - qcom,msm8974-pnoc
      - qcom,msm8974-snoc

  '#interconnect-cells':
    const: 1

  clock-names:
    items:
      - const: bus
      - const: bus_a

  clocks:
    items:
      - description: Bus Clock
      - description: Bus A Clock

required:
  - compatible
  - reg
  - '#interconnect-cells'
  - clock-names
  - clocks

additionalProperties: false
unevaluatedProperties: false

allOf:
  - $ref: qcom,rpm-common.yaml#
  - if:
      properties:
        compatible:
          const: qcom,msm8974-mmssnoc
    then:
      required:
        - clocks
        - clock-names
    else:
      properties:
        clocks: false
        clock-names: false

examples:
  - |
@@ -56,7 +63,4 @@ examples:
        reg = <0xfc380000 0x6a000>;
        compatible = "qcom,msm8974-bimc";
        #interconnect-cells = <1>;
        clock-names = "bus", "bus_a";
        clocks = <&rpmcc RPM_SMD_BIMC_CLK>,
                 <&rpmcc RPM_SMD_BIMC_A_CLK>;
    };
+6 −0
Original line number Diff line number Diff line
@@ -31,6 +31,12 @@ const struct rpm_clk_resource mem_1_clk = {
};
EXPORT_SYMBOL_GPL(mem_1_clk);

const struct rpm_clk_resource gpu_mem_2_clk = {
	.resource_type = QCOM_SMD_RPM_MEM_CLK,
	.clock_id = 2,
};
EXPORT_SYMBOL_GPL(gpu_mem_2_clk);

const struct rpm_clk_resource bus_0_clk = {
	.resource_type = QCOM_SMD_RPM_BUS_CLK,
	.clock_id = 0,
+11 −7
Original line number Diff line number Diff line
@@ -204,7 +204,7 @@ static int qcom_icc_qos_set(struct icc_node *node)
	}
}

static int qcom_icc_rpm_set(struct qcom_icc_node *qn, u64 *bw)
static int qcom_icc_rpm_set(struct qcom_icc_node *qn, u64 *bw, bool ignore_enxio)
{
	int ret, rpm_ctx = 0;
	u64 bw_bps;
@@ -223,6 +223,7 @@ static int qcom_icc_rpm_set(struct qcom_icc_node *qn, u64 *bw)
			if (ret) {
				pr_err("qcom_icc_rpm_smd_send mas %d error %d\n",
				       qn->mas_rpm_id, ret);
				if (ret != -ENXIO || !ignore_enxio)
					return ret;
			}
		}
@@ -235,6 +236,7 @@ static int qcom_icc_rpm_set(struct qcom_icc_node *qn, u64 *bw)
			if (ret) {
				pr_err("qcom_icc_rpm_smd_send slv %d error %d\n",
				       qn->slv_rpm_id, ret);
				if (ret != -ENXIO || !ignore_enxio)
					return ret;
			}
		}
@@ -361,12 +363,12 @@ static int qcom_icc_set(struct icc_node *src, struct icc_node *dst)
	active_rate = agg_clk_rate[QCOM_SMD_RPM_ACTIVE_STATE];
	sleep_rate = agg_clk_rate[QCOM_SMD_RPM_SLEEP_STATE];

	ret = qcom_icc_rpm_set(src_qn, src_qn->sum_avg);
	ret = qcom_icc_rpm_set(src_qn, src_qn->sum_avg, qp->ignore_enxio);
	if (ret)
		return ret;

	if (dst_qn) {
		ret = qcom_icc_rpm_set(dst_qn, dst_qn->sum_avg);
		ret = qcom_icc_rpm_set(dst_qn, dst_qn->sum_avg, qp->ignore_enxio);
		if (ret)
			return ret;
	}
@@ -509,6 +511,7 @@ int qnoc_probe(struct platform_device *pdev)
	for (i = 0; i < cd_num; i++)
		qp->intf_clks[i].id = cds[i];

	qp->ignore_enxio = desc->ignore_enxio;
	qp->keep_alive = desc->keep_alive;
	qp->type = desc->type;
	qp->qos_offset = desc->qos_offset;
@@ -553,6 +556,7 @@ int qnoc_probe(struct platform_device *pdev)
	provider->aggregate = qcom_icc_bw_aggregate;
	provider->xlate_extended = qcom_icc_xlate_extended;
	provider->data = data;
	provider->get_bw = desc->get_bw;

	icc_provider_init(provider);

+5 −2
Original line number Diff line number Diff line
@@ -51,7 +51,7 @@ struct rpm_clk_resource {
 * @bus_clk: a pointer to a HLOS-owned bus clock
 * @intf_clks: a clk_bulk_data array of interface clocks
 * @keep_alive: whether to always keep a minimum vote on the bus clocks
 * @is_on: whether the bus is powered on
 * @ignore_enxio: whether to ignore ENXIO errors (for MSM8974)
 */
struct qcom_icc_provider {
	struct icc_provider provider;
@@ -66,7 +66,7 @@ struct qcom_icc_provider {
	struct clk *bus_clk;
	struct clk_bulk_data *intf_clks;
	bool keep_alive;
	bool is_on;
	bool ignore_enxio;
};

/**
@@ -137,6 +137,8 @@ struct qcom_icc_desc {
	unsigned int qos_offset;
	u16 ab_coeff;
	u16 ib_coeff;
	int (*get_bw)(struct icc_node *node, u32 *avg, u32 *peak);
	bool ignore_enxio;
};

/* Valid for all bus types */
@@ -152,6 +154,7 @@ extern const struct rpm_clk_resource bimc_clk;
extern const struct rpm_clk_resource bus_0_clk;
extern const struct rpm_clk_resource bus_1_clk;
extern const struct rpm_clk_resource bus_2_clk;
extern const struct rpm_clk_resource gpu_mem_2_clk;
extern const struct rpm_clk_resource mem_1_clk;
extern const struct rpm_clk_resource mmaxi_0_clk;
extern const struct rpm_clk_resource mmaxi_1_clk;
+1233 −404

File changed.

Preview size limit exceeded, changes collapsed.