mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
Merge branch 'icc-msm8974' into icc-next
Commit d6edc31f3a ("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: Alexandre Messier <alex@me.ssier.org>
Tested-by: Luca Weiss <luca.weiss@fairphone.com> # fairphone-fp2
Signed-off-by: Georgi Djakov <djakov@kernel.org>
This commit is contained in:
commit
be0df73d5f
|
|
@ -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>;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -222,8 +222,9 @@ static int qcom_icc_rpm_set(struct qcom_icc_node *qn, u64 *bw)
|
|||
bw_bps);
|
||||
if (ret) {
|
||||
pr_err("qcom_icc_rpm_smd_send mas %d error %d\n",
|
||||
qn->mas_rpm_id, ret);
|
||||
return ret;
|
||||
qn->mas_rpm_id, ret);
|
||||
if (ret != -ENXIO || !ignore_enxio)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -234,8 +235,9 @@ static int qcom_icc_rpm_set(struct qcom_icc_node *qn, u64 *bw)
|
|||
bw_bps);
|
||||
if (ret) {
|
||||
pr_err("qcom_icc_rpm_smd_send slv %d error %d\n",
|
||||
qn->slv_rpm_id, ret);
|
||||
return ret;
|
||||
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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user