^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Qualcomm ADSP/SLPI Peripheral Image Loader for MSM8974 and MSM8996
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2016 Linaro Ltd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2014 Sony Mobile Communications AB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/clk.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/firmware.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/of_address.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/of_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/pm_domain.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/pm_runtime.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/qcom_scm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/regulator/consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/remoteproc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/soc/qcom/mdt_loader.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/soc/qcom/smem.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/soc/qcom/smem_state.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include "qcom_common.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include "qcom_pil_info.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include "qcom_q6v5.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include "remoteproc_internal.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) struct adsp_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) int crash_reason_smem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) const char *firmware_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) int pas_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) bool has_aggre2_clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) bool auto_boot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) char **active_pd_names;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) char **proxy_pd_names;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) const char *ssr_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) const char *sysmon_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) int ssctl_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) struct qcom_adsp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct rproc *rproc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) struct qcom_q6v5 q6v5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) struct clk *xo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) struct clk *aggre2_clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct regulator *cx_supply;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct regulator *px_supply;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct device *active_pds[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) struct device *proxy_pds[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) int active_pd_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) int proxy_pd_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) int pas_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) int crash_reason_smem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) bool has_aggre2_clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) const char *info_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) struct completion start_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) struct completion stop_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) phys_addr_t mem_phys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) phys_addr_t mem_reloc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) void *mem_region;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) size_t mem_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) struct qcom_rproc_glink glink_subdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) struct qcom_rproc_subdev smd_subdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) struct qcom_rproc_ssr ssr_subdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) struct qcom_sysmon *sysmon;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) static int adsp_pds_enable(struct qcom_adsp *adsp, struct device **pds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) size_t pd_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) for (i = 0; i < pd_count; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) dev_pm_genpd_set_performance_state(pds[i], INT_MAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) ret = pm_runtime_get_sync(pds[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) pm_runtime_put_noidle(pds[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) dev_pm_genpd_set_performance_state(pds[i], 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) goto unroll_pd_votes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) unroll_pd_votes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) for (i--; i >= 0; i--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) dev_pm_genpd_set_performance_state(pds[i], 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) pm_runtime_put(pds[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) static void adsp_pds_disable(struct qcom_adsp *adsp, struct device **pds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) size_t pd_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) for (i = 0; i < pd_count; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) dev_pm_genpd_set_performance_state(pds[i], 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) pm_runtime_put(pds[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) static int adsp_load(struct rproc *rproc, const struct firmware *fw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) ret = qcom_mdt_load(adsp->dev, fw, rproc->firmware, adsp->pas_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) adsp->mem_region, adsp->mem_phys, adsp->mem_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) &adsp->mem_reloc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) qcom_pil_info_store(adsp->info_name, adsp->mem_phys, adsp->mem_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) static int adsp_start(struct rproc *rproc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) qcom_q6v5_prepare(&adsp->q6v5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) ret = adsp_pds_enable(adsp, adsp->active_pds, adsp->active_pd_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) goto disable_irqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) ret = adsp_pds_enable(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) goto disable_active_pds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) ret = clk_prepare_enable(adsp->xo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) goto disable_proxy_pds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) ret = clk_prepare_enable(adsp->aggre2_clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) goto disable_xo_clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) ret = regulator_enable(adsp->cx_supply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) goto disable_aggre2_clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) ret = regulator_enable(adsp->px_supply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) goto disable_cx_supply;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) ret = qcom_scm_pas_auth_and_reset(adsp->pas_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) dev_err(adsp->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) "failed to authenticate image and release reset\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) goto disable_px_supply;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) ret = qcom_q6v5_wait_for_start(&adsp->q6v5, msecs_to_jiffies(5000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) if (ret == -ETIMEDOUT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) dev_err(adsp->dev, "start timed out\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) qcom_scm_pas_shutdown(adsp->pas_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) goto disable_px_supply;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) disable_px_supply:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) regulator_disable(adsp->px_supply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) disable_cx_supply:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) regulator_disable(adsp->cx_supply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) disable_aggre2_clk:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) clk_disable_unprepare(adsp->aggre2_clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) disable_xo_clk:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) clk_disable_unprepare(adsp->xo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) disable_proxy_pds:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) adsp_pds_disable(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) disable_active_pds:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) adsp_pds_disable(adsp, adsp->active_pds, adsp->active_pd_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) disable_irqs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) qcom_q6v5_unprepare(&adsp->q6v5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) static void qcom_pas_handover(struct qcom_q6v5 *q6v5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) struct qcom_adsp *adsp = container_of(q6v5, struct qcom_adsp, q6v5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) regulator_disable(adsp->px_supply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) regulator_disable(adsp->cx_supply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) clk_disable_unprepare(adsp->aggre2_clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) clk_disable_unprepare(adsp->xo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) adsp_pds_disable(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) static int adsp_stop(struct rproc *rproc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) int handover;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) ret = qcom_q6v5_request_stop(&adsp->q6v5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) if (ret == -ETIMEDOUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) dev_err(adsp->dev, "timed out on wait\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) ret = qcom_scm_pas_shutdown(adsp->pas_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) dev_err(adsp->dev, "failed to shutdown: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) adsp_pds_disable(adsp, adsp->active_pds, adsp->active_pd_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) handover = qcom_q6v5_unprepare(&adsp->q6v5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) if (handover)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) qcom_pas_handover(&adsp->q6v5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) static void *adsp_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) int offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) offset = da - adsp->mem_reloc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) if (offset < 0 || offset + len > adsp->mem_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) return adsp->mem_region + offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) static unsigned long adsp_panic(struct rproc *rproc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) return qcom_q6v5_panic(&adsp->q6v5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) static const struct rproc_ops adsp_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) .start = adsp_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) .stop = adsp_stop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) .da_to_va = adsp_da_to_va,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) .parse_fw = qcom_register_dump_segments,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) .load = adsp_load,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) .panic = adsp_panic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) static int adsp_init_clock(struct qcom_adsp *adsp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) adsp->xo = devm_clk_get(adsp->dev, "xo");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) if (IS_ERR(adsp->xo)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) ret = PTR_ERR(adsp->xo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) if (ret != -EPROBE_DEFER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) dev_err(adsp->dev, "failed to get xo clock");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) if (adsp->has_aggre2_clk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) adsp->aggre2_clk = devm_clk_get(adsp->dev, "aggre2");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) if (IS_ERR(adsp->aggre2_clk)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) ret = PTR_ERR(adsp->aggre2_clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) if (ret != -EPROBE_DEFER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) dev_err(adsp->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) "failed to get aggre2 clock");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) static int adsp_init_regulator(struct qcom_adsp *adsp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) adsp->cx_supply = devm_regulator_get(adsp->dev, "cx");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) if (IS_ERR(adsp->cx_supply))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) return PTR_ERR(adsp->cx_supply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) regulator_set_load(adsp->cx_supply, 100000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) adsp->px_supply = devm_regulator_get(adsp->dev, "px");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) return PTR_ERR_OR_ZERO(adsp->px_supply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) static int adsp_pds_attach(struct device *dev, struct device **devs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) char **pd_names)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) size_t num_pds = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) if (!pd_names)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) /* Handle single power domain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) if (dev->pm_domain) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) devs[0] = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) pm_runtime_enable(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) while (pd_names[num_pds])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) num_pds++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) for (i = 0; i < num_pds; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) devs[i] = dev_pm_domain_attach_by_name(dev, pd_names[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) if (IS_ERR_OR_NULL(devs[i])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) ret = PTR_ERR(devs[i]) ? : -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) goto unroll_attach;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) return num_pds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) unroll_attach:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) for (i--; i >= 0; i--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) dev_pm_domain_detach(devs[i], false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) static void adsp_pds_detach(struct qcom_adsp *adsp, struct device **pds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) size_t pd_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) struct device *dev = adsp->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) /* Handle single power domain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) if (dev->pm_domain && pd_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) pm_runtime_disable(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) for (i = 0; i < pd_count; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) dev_pm_domain_detach(pds[i], false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) static int adsp_alloc_memory_region(struct qcom_adsp *adsp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) struct device_node *node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) struct resource r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) node = of_parse_phandle(adsp->dev->of_node, "memory-region", 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) if (!node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) dev_err(adsp->dev, "no memory-region specified\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) ret = of_address_to_resource(node, 0, &r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) adsp->mem_phys = adsp->mem_reloc = r.start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) adsp->mem_size = resource_size(&r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) adsp->mem_region = devm_ioremap_wc(adsp->dev, adsp->mem_phys, adsp->mem_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) if (!adsp->mem_region) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) dev_err(adsp->dev, "unable to map memory region: %pa+%zx\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) &r.start, adsp->mem_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) static int adsp_probe(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) const struct adsp_data *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) struct qcom_adsp *adsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) struct rproc *rproc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) const char *fw_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) desc = of_device_get_match_data(&pdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) if (!desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) if (!qcom_scm_is_available())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) return -EPROBE_DEFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) fw_name = desc->firmware_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) ret = of_property_read_string(pdev->dev.of_node, "firmware-name",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) &fw_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) if (ret < 0 && ret != -EINVAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) rproc = rproc_alloc(&pdev->dev, pdev->name, &adsp_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) fw_name, sizeof(*adsp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) if (!rproc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) dev_err(&pdev->dev, "unable to allocate remoteproc\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) rproc->auto_boot = desc->auto_boot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) rproc_coredump_set_elf_info(rproc, ELFCLASS32, EM_NONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) adsp = (struct qcom_adsp *)rproc->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) adsp->dev = &pdev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) adsp->rproc = rproc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) adsp->pas_id = desc->pas_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) adsp->has_aggre2_clk = desc->has_aggre2_clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) adsp->info_name = desc->sysmon_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) platform_set_drvdata(pdev, adsp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) device_wakeup_enable(adsp->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) ret = adsp_alloc_memory_region(adsp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) goto free_rproc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) ret = adsp_init_clock(adsp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) goto free_rproc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) ret = adsp_init_regulator(adsp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) goto free_rproc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) ret = adsp_pds_attach(&pdev->dev, adsp->active_pds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) desc->active_pd_names);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) goto free_rproc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) adsp->active_pd_count = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) ret = adsp_pds_attach(&pdev->dev, adsp->proxy_pds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) desc->proxy_pd_names);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) goto detach_active_pds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) adsp->proxy_pd_count = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) ret = qcom_q6v5_init(&adsp->q6v5, pdev, rproc, desc->crash_reason_smem,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) qcom_pas_handover);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) goto detach_proxy_pds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) qcom_add_glink_subdev(rproc, &adsp->glink_subdev, desc->ssr_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) qcom_add_smd_subdev(rproc, &adsp->smd_subdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) qcom_add_ssr_subdev(rproc, &adsp->ssr_subdev, desc->ssr_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) adsp->sysmon = qcom_add_sysmon_subdev(rproc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) desc->sysmon_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) desc->ssctl_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) if (IS_ERR(adsp->sysmon)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) ret = PTR_ERR(adsp->sysmon);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) goto detach_proxy_pds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) ret = rproc_add(rproc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) goto detach_proxy_pds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) detach_proxy_pds:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) adsp_pds_detach(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) detach_active_pds:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) adsp_pds_detach(adsp, adsp->active_pds, adsp->active_pd_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) free_rproc:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) rproc_free(rproc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) static int adsp_remove(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) struct qcom_adsp *adsp = platform_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) rproc_del(adsp->rproc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) qcom_remove_glink_subdev(adsp->rproc, &adsp->glink_subdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) qcom_remove_sysmon_subdev(adsp->sysmon);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) qcom_remove_smd_subdev(adsp->rproc, &adsp->smd_subdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) qcom_remove_ssr_subdev(adsp->rproc, &adsp->ssr_subdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) rproc_free(adsp->rproc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) static const struct adsp_data adsp_resource_init = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) .crash_reason_smem = 423,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) .firmware_name = "adsp.mdt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) .pas_id = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) .has_aggre2_clk = false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) .auto_boot = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) .ssr_name = "lpass",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) .sysmon_name = "adsp",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) .ssctl_id = 0x14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) static const struct adsp_data sm8150_adsp_resource = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) .crash_reason_smem = 423,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) .firmware_name = "adsp.mdt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) .pas_id = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) .has_aggre2_clk = false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) .auto_boot = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) .active_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) "load_state",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) .proxy_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) "cx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) .ssr_name = "lpass",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) .sysmon_name = "adsp",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) .ssctl_id = 0x14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) static const struct adsp_data sm8250_adsp_resource = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) .crash_reason_smem = 423,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) .firmware_name = "adsp.mdt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) .pas_id = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) .has_aggre2_clk = false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) .auto_boot = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) .active_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) "load_state",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) .proxy_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) "lcx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) "lmx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) .ssr_name = "lpass",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) .sysmon_name = "adsp",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) .ssctl_id = 0x14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) static const struct adsp_data msm8998_adsp_resource = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) .crash_reason_smem = 423,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) .firmware_name = "adsp.mdt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) .pas_id = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) .has_aggre2_clk = false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) .auto_boot = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) .proxy_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) "cx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) .ssr_name = "lpass",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) .sysmon_name = "adsp",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) .ssctl_id = 0x14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) static const struct adsp_data cdsp_resource_init = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) .crash_reason_smem = 601,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) .firmware_name = "cdsp.mdt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) .pas_id = 18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) .has_aggre2_clk = false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) .auto_boot = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) .ssr_name = "cdsp",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) .sysmon_name = "cdsp",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) .ssctl_id = 0x17,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) static const struct adsp_data sm8150_cdsp_resource = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) .crash_reason_smem = 601,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) .firmware_name = "cdsp.mdt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) .pas_id = 18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) .has_aggre2_clk = false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) .auto_boot = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) .active_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) "load_state",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) .proxy_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) "cx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) .ssr_name = "cdsp",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) .sysmon_name = "cdsp",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) .ssctl_id = 0x17,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) static const struct adsp_data sm8250_cdsp_resource = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) .crash_reason_smem = 601,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) .firmware_name = "cdsp.mdt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) .pas_id = 18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) .has_aggre2_clk = false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) .auto_boot = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) .active_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) "load_state",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) .proxy_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) "cx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) .ssr_name = "cdsp",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) .sysmon_name = "cdsp",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) .ssctl_id = 0x17,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) static const struct adsp_data mpss_resource_init = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) .crash_reason_smem = 421,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) .firmware_name = "modem.mdt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) .pas_id = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) .has_aggre2_clk = false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) .auto_boot = false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) .active_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) "load_state",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) .proxy_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) "cx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) "mss",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) .ssr_name = "mpss",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) .sysmon_name = "modem",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) .ssctl_id = 0x12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) static const struct adsp_data slpi_resource_init = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) .crash_reason_smem = 424,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) .firmware_name = "slpi.mdt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) .pas_id = 12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) .has_aggre2_clk = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) .auto_boot = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) .ssr_name = "dsps",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) .sysmon_name = "slpi",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) .ssctl_id = 0x16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) static const struct adsp_data sm8150_slpi_resource = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) .crash_reason_smem = 424,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) .firmware_name = "slpi.mdt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) .pas_id = 12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) .has_aggre2_clk = false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) .auto_boot = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) .active_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) "load_state",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) .proxy_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) "lcx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) "lmx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) .ssr_name = "dsps",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) .sysmon_name = "slpi",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) .ssctl_id = 0x16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) static const struct adsp_data sm8250_slpi_resource = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) .crash_reason_smem = 424,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) .firmware_name = "slpi.mdt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) .pas_id = 12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) .has_aggre2_clk = false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) .auto_boot = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) .active_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) "load_state",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) .proxy_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) "lcx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) "lmx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) .ssr_name = "dsps",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) .sysmon_name = "slpi",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) .ssctl_id = 0x16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) static const struct adsp_data msm8998_slpi_resource = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) .crash_reason_smem = 424,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) .firmware_name = "slpi.mdt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) .pas_id = 12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) .has_aggre2_clk = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) .auto_boot = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) .proxy_pd_names = (char*[]){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) "ssc_cx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) .ssr_name = "dsps",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) .sysmon_name = "slpi",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) .ssctl_id = 0x16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) static const struct adsp_data wcss_resource_init = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) .crash_reason_smem = 421,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) .firmware_name = "wcnss.mdt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) .pas_id = 6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) .auto_boot = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) .ssr_name = "mpss",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) .sysmon_name = "wcnss",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) .ssctl_id = 0x12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) static const struct of_device_id adsp_of_match[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) { .compatible = "qcom,msm8974-adsp-pil", .data = &adsp_resource_init},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) { .compatible = "qcom,msm8996-adsp-pil", .data = &adsp_resource_init},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) { .compatible = "qcom,msm8996-slpi-pil", .data = &slpi_resource_init},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) { .compatible = "qcom,msm8998-adsp-pas", .data = &msm8998_adsp_resource},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) { .compatible = "qcom,msm8998-slpi-pas", .data = &msm8998_slpi_resource},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) { .compatible = "qcom,qcs404-adsp-pas", .data = &adsp_resource_init },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) { .compatible = "qcom,qcs404-cdsp-pas", .data = &cdsp_resource_init },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) { .compatible = "qcom,qcs404-wcss-pas", .data = &wcss_resource_init },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) { .compatible = "qcom,sc7180-mpss-pas", .data = &mpss_resource_init},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) { .compatible = "qcom,sdm845-adsp-pas", .data = &adsp_resource_init},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) { .compatible = "qcom,sdm845-cdsp-pas", .data = &cdsp_resource_init},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) { .compatible = "qcom,sm8150-adsp-pas", .data = &sm8150_adsp_resource},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) { .compatible = "qcom,sm8150-cdsp-pas", .data = &sm8150_cdsp_resource},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) { .compatible = "qcom,sm8150-mpss-pas", .data = &mpss_resource_init},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) { .compatible = "qcom,sm8150-slpi-pas", .data = &sm8150_slpi_resource},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) { .compatible = "qcom,sm8250-adsp-pas", .data = &sm8250_adsp_resource},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) { .compatible = "qcom,sm8250-cdsp-pas", .data = &sm8250_cdsp_resource},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) { .compatible = "qcom,sm8250-slpi-pas", .data = &sm8250_slpi_resource},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) { },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) MODULE_DEVICE_TABLE(of, adsp_of_match);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) static struct platform_driver adsp_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) .probe = adsp_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) .remove = adsp_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) .name = "qcom_q6v5_pas",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) .of_match_table = adsp_of_match,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) module_platform_driver(adsp_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) MODULE_DESCRIPTION("Qualcomm Hexagon v5 Peripheral Authentication Service driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) MODULE_LICENSE("GPL v2");