Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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");