brintos

brintos / linux-shallow public Read only

0
0
Text · 35.8 KiB · ef82835 Raw
1490 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Qualcomm ADSP/SLPI Peripheral Image Loader for MSM8974 and MSM89964 *5 * Copyright (C) 2016 Linaro Ltd6 * Copyright (C) 2014 Sony Mobile Communications AB7 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.8 */9 10#include <linux/clk.h>11#include <linux/delay.h>12#include <linux/firmware.h>13#include <linux/interrupt.h>14#include <linux/kernel.h>15#include <linux/module.h>16#include <linux/of.h>17#include <linux/of_address.h>18#include <linux/of_reserved_mem.h>19#include <linux/platform_device.h>20#include <linux/pm_domain.h>21#include <linux/pm_runtime.h>22#include <linux/firmware/qcom/qcom_scm.h>23#include <linux/regulator/consumer.h>24#include <linux/remoteproc.h>25#include <linux/soc/qcom/mdt_loader.h>26#include <linux/soc/qcom/smem.h>27#include <linux/soc/qcom/smem_state.h>28 29#include "qcom_common.h"30#include "qcom_pil_info.h"31#include "qcom_q6v5.h"32#include "remoteproc_internal.h"33 34#define ADSP_DECRYPT_SHUTDOWN_DELAY_MS	10035 36#define MAX_ASSIGN_COUNT 337 38struct adsp_data {39	int crash_reason_smem;40	const char *firmware_name;41	const char *dtb_firmware_name;42	int pas_id;43	int dtb_pas_id;44	int lite_pas_id;45	unsigned int minidump_id;46	bool auto_boot;47	bool decrypt_shutdown;48 49	char **proxy_pd_names;50 51	const char *load_state;52	const char *ssr_name;53	const char *sysmon_name;54	int ssctl_id;55	unsigned int smem_host_id;56 57	int region_assign_idx;58	int region_assign_count;59	bool region_assign_shared;60	int region_assign_vmid;61};62 63struct qcom_adsp {64	struct device *dev;65	struct rproc *rproc;66 67	struct qcom_q6v5 q6v5;68 69	struct clk *xo;70	struct clk *aggre2_clk;71 72	struct regulator *cx_supply;73	struct regulator *px_supply;74 75	struct device *proxy_pds[3];76 77	int proxy_pd_count;78 79	const char *dtb_firmware_name;80	int pas_id;81	int dtb_pas_id;82	int lite_pas_id;83	unsigned int minidump_id;84	int crash_reason_smem;85	unsigned int smem_host_id;86	bool decrypt_shutdown;87	const char *info_name;88 89	const struct firmware *firmware;90	const struct firmware *dtb_firmware;91 92	struct completion start_done;93	struct completion stop_done;94 95	phys_addr_t mem_phys;96	phys_addr_t dtb_mem_phys;97	phys_addr_t mem_reloc;98	phys_addr_t dtb_mem_reloc;99	phys_addr_t region_assign_phys[MAX_ASSIGN_COUNT];100	void *mem_region;101	void *dtb_mem_region;102	size_t mem_size;103	size_t dtb_mem_size;104	size_t region_assign_size[MAX_ASSIGN_COUNT];105 106	int region_assign_idx;107	int region_assign_count;108	bool region_assign_shared;109	int region_assign_vmid;110	u64 region_assign_owners[MAX_ASSIGN_COUNT];111 112	struct qcom_rproc_glink glink_subdev;113	struct qcom_rproc_subdev smd_subdev;114	struct qcom_rproc_pdm pdm_subdev;115	struct qcom_rproc_ssr ssr_subdev;116	struct qcom_sysmon *sysmon;117 118	struct qcom_scm_pas_metadata pas_metadata;119	struct qcom_scm_pas_metadata dtb_pas_metadata;120};121 122static void adsp_segment_dump(struct rproc *rproc, struct rproc_dump_segment *segment,123		       void *dest, size_t offset, size_t size)124{125	struct qcom_adsp *adsp = rproc->priv;126	int total_offset;127 128	total_offset = segment->da + segment->offset + offset - adsp->mem_phys;129	if (total_offset < 0 || total_offset + size > adsp->mem_size) {130		dev_err(adsp->dev,131			"invalid copy request for segment %pad with offset %zu and size %zu)\n",132			&segment->da, offset, size);133		memset(dest, 0xff, size);134		return;135	}136 137	memcpy_fromio(dest, adsp->mem_region + total_offset, size);138}139 140static void adsp_minidump(struct rproc *rproc)141{142	struct qcom_adsp *adsp = rproc->priv;143 144	if (rproc->dump_conf == RPROC_COREDUMP_DISABLED)145		return;146 147	qcom_minidump(rproc, adsp->minidump_id, adsp_segment_dump);148}149 150static int adsp_pds_enable(struct qcom_adsp *adsp, struct device **pds,151			   size_t pd_count)152{153	int ret;154	int i;155 156	for (i = 0; i < pd_count; i++) {157		dev_pm_genpd_set_performance_state(pds[i], INT_MAX);158		ret = pm_runtime_get_sync(pds[i]);159		if (ret < 0) {160			pm_runtime_put_noidle(pds[i]);161			dev_pm_genpd_set_performance_state(pds[i], 0);162			goto unroll_pd_votes;163		}164	}165 166	return 0;167 168unroll_pd_votes:169	for (i--; i >= 0; i--) {170		dev_pm_genpd_set_performance_state(pds[i], 0);171		pm_runtime_put(pds[i]);172	}173 174	return ret;175};176 177static void adsp_pds_disable(struct qcom_adsp *adsp, struct device **pds,178			     size_t pd_count)179{180	int i;181 182	for (i = 0; i < pd_count; i++) {183		dev_pm_genpd_set_performance_state(pds[i], 0);184		pm_runtime_put(pds[i]);185	}186}187 188static int adsp_shutdown_poll_decrypt(struct qcom_adsp *adsp)189{190	unsigned int retry_num = 50;191	int ret;192 193	do {194		msleep(ADSP_DECRYPT_SHUTDOWN_DELAY_MS);195		ret = qcom_scm_pas_shutdown(adsp->pas_id);196	} while (ret == -EINVAL && --retry_num);197 198	return ret;199}200 201static int adsp_unprepare(struct rproc *rproc)202{203	struct qcom_adsp *adsp = rproc->priv;204 205	/*206	 * adsp_load() did pass pas_metadata to the SCM driver for storing207	 * metadata context. It might have been released already if208	 * auth_and_reset() was successful, but in other cases clean it up209	 * here.210	 */211	qcom_scm_pas_metadata_release(&adsp->pas_metadata);212	if (adsp->dtb_pas_id)213		qcom_scm_pas_metadata_release(&adsp->dtb_pas_metadata);214 215	return 0;216}217 218static int adsp_load(struct rproc *rproc, const struct firmware *fw)219{220	struct qcom_adsp *adsp = rproc->priv;221	int ret;222 223	/* Store firmware handle to be used in adsp_start() */224	adsp->firmware = fw;225 226	if (adsp->lite_pas_id)227		ret = qcom_scm_pas_shutdown(adsp->lite_pas_id);228 229	if (adsp->dtb_pas_id) {230		ret = request_firmware(&adsp->dtb_firmware, adsp->dtb_firmware_name, adsp->dev);231		if (ret) {232			dev_err(adsp->dev, "request_firmware failed for %s: %d\n",233				adsp->dtb_firmware_name, ret);234			return ret;235		}236 237		ret = qcom_mdt_pas_init(adsp->dev, adsp->dtb_firmware, adsp->dtb_firmware_name,238					adsp->dtb_pas_id, adsp->dtb_mem_phys,239					&adsp->dtb_pas_metadata);240		if (ret)241			goto release_dtb_firmware;242 243		ret = qcom_mdt_load_no_init(adsp->dev, adsp->dtb_firmware, adsp->dtb_firmware_name,244					    adsp->dtb_pas_id, adsp->dtb_mem_region,245					    adsp->dtb_mem_phys, adsp->dtb_mem_size,246					    &adsp->dtb_mem_reloc);247		if (ret)248			goto release_dtb_metadata;249	}250 251	return 0;252 253release_dtb_metadata:254	qcom_scm_pas_metadata_release(&adsp->dtb_pas_metadata);255 256release_dtb_firmware:257	release_firmware(adsp->dtb_firmware);258 259	return ret;260}261 262static int adsp_start(struct rproc *rproc)263{264	struct qcom_adsp *adsp = rproc->priv;265	int ret;266 267	ret = qcom_q6v5_prepare(&adsp->q6v5);268	if (ret)269		return ret;270 271	ret = adsp_pds_enable(adsp, adsp->proxy_pds, adsp->proxy_pd_count);272	if (ret < 0)273		goto disable_irqs;274 275	ret = clk_prepare_enable(adsp->xo);276	if (ret)277		goto disable_proxy_pds;278 279	ret = clk_prepare_enable(adsp->aggre2_clk);280	if (ret)281		goto disable_xo_clk;282 283	if (adsp->cx_supply) {284		ret = regulator_enable(adsp->cx_supply);285		if (ret)286			goto disable_aggre2_clk;287	}288 289	if (adsp->px_supply) {290		ret = regulator_enable(adsp->px_supply);291		if (ret)292			goto disable_cx_supply;293	}294 295	if (adsp->dtb_pas_id) {296		ret = qcom_scm_pas_auth_and_reset(adsp->dtb_pas_id);297		if (ret) {298			dev_err(adsp->dev,299				"failed to authenticate dtb image and release reset\n");300			goto disable_px_supply;301		}302	}303 304	ret = qcom_mdt_pas_init(adsp->dev, adsp->firmware, rproc->firmware, adsp->pas_id,305				adsp->mem_phys, &adsp->pas_metadata);306	if (ret)307		goto disable_px_supply;308 309	ret = qcom_mdt_load_no_init(adsp->dev, adsp->firmware, rproc->firmware, adsp->pas_id,310				    adsp->mem_region, adsp->mem_phys, adsp->mem_size,311				    &adsp->mem_reloc);312	if (ret)313		goto release_pas_metadata;314 315	qcom_pil_info_store(adsp->info_name, adsp->mem_phys, adsp->mem_size);316 317	ret = qcom_scm_pas_auth_and_reset(adsp->pas_id);318	if (ret) {319		dev_err(adsp->dev,320			"failed to authenticate image and release reset\n");321		goto release_pas_metadata;322	}323 324	ret = qcom_q6v5_wait_for_start(&adsp->q6v5, msecs_to_jiffies(5000));325	if (ret == -ETIMEDOUT) {326		dev_err(adsp->dev, "start timed out\n");327		qcom_scm_pas_shutdown(adsp->pas_id);328		goto release_pas_metadata;329	}330 331	qcom_scm_pas_metadata_release(&adsp->pas_metadata);332	if (adsp->dtb_pas_id)333		qcom_scm_pas_metadata_release(&adsp->dtb_pas_metadata);334 335	/* Remove pointer to the loaded firmware, only valid in adsp_load() & adsp_start() */336	adsp->firmware = NULL;337 338	return 0;339 340release_pas_metadata:341	qcom_scm_pas_metadata_release(&adsp->pas_metadata);342	if (adsp->dtb_pas_id)343		qcom_scm_pas_metadata_release(&adsp->dtb_pas_metadata);344disable_px_supply:345	if (adsp->px_supply)346		regulator_disable(adsp->px_supply);347disable_cx_supply:348	if (adsp->cx_supply)349		regulator_disable(adsp->cx_supply);350disable_aggre2_clk:351	clk_disable_unprepare(adsp->aggre2_clk);352disable_xo_clk:353	clk_disable_unprepare(adsp->xo);354disable_proxy_pds:355	adsp_pds_disable(adsp, adsp->proxy_pds, adsp->proxy_pd_count);356disable_irqs:357	qcom_q6v5_unprepare(&adsp->q6v5);358 359	/* Remove pointer to the loaded firmware, only valid in adsp_load() & adsp_start() */360	adsp->firmware = NULL;361 362	return ret;363}364 365static void qcom_pas_handover(struct qcom_q6v5 *q6v5)366{367	struct qcom_adsp *adsp = container_of(q6v5, struct qcom_adsp, q6v5);368 369	if (adsp->px_supply)370		regulator_disable(adsp->px_supply);371	if (adsp->cx_supply)372		regulator_disable(adsp->cx_supply);373	clk_disable_unprepare(adsp->aggre2_clk);374	clk_disable_unprepare(adsp->xo);375	adsp_pds_disable(adsp, adsp->proxy_pds, adsp->proxy_pd_count);376}377 378static int adsp_stop(struct rproc *rproc)379{380	struct qcom_adsp *adsp = rproc->priv;381	int handover;382	int ret;383 384	ret = qcom_q6v5_request_stop(&adsp->q6v5, adsp->sysmon);385	if (ret == -ETIMEDOUT)386		dev_err(adsp->dev, "timed out on wait\n");387 388	ret = qcom_scm_pas_shutdown(adsp->pas_id);389	if (ret && adsp->decrypt_shutdown)390		ret = adsp_shutdown_poll_decrypt(adsp);391 392	if (ret)393		dev_err(adsp->dev, "failed to shutdown: %d\n", ret);394 395	if (adsp->dtb_pas_id) {396		ret = qcom_scm_pas_shutdown(adsp->dtb_pas_id);397		if (ret)398			dev_err(adsp->dev, "failed to shutdown dtb: %d\n", ret);399	}400 401	handover = qcom_q6v5_unprepare(&adsp->q6v5);402	if (handover)403		qcom_pas_handover(&adsp->q6v5);404 405	if (adsp->smem_host_id)406		ret = qcom_smem_bust_hwspin_lock_by_host(adsp->smem_host_id);407 408	return ret;409}410 411static void *adsp_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem)412{413	struct qcom_adsp *adsp = rproc->priv;414	int offset;415 416	offset = da - adsp->mem_reloc;417	if (offset < 0 || offset + len > adsp->mem_size)418		return NULL;419 420	if (is_iomem)421		*is_iomem = true;422 423	return adsp->mem_region + offset;424}425 426static unsigned long adsp_panic(struct rproc *rproc)427{428	struct qcom_adsp *adsp = rproc->priv;429 430	return qcom_q6v5_panic(&adsp->q6v5);431}432 433static const struct rproc_ops adsp_ops = {434	.unprepare = adsp_unprepare,435	.start = adsp_start,436	.stop = adsp_stop,437	.da_to_va = adsp_da_to_va,438	.parse_fw = qcom_register_dump_segments,439	.load = adsp_load,440	.panic = adsp_panic,441};442 443static const struct rproc_ops adsp_minidump_ops = {444	.unprepare = adsp_unprepare,445	.start = adsp_start,446	.stop = adsp_stop,447	.da_to_va = adsp_da_to_va,448	.parse_fw = qcom_register_dump_segments,449	.load = adsp_load,450	.panic = adsp_panic,451	.coredump = adsp_minidump,452};453 454static int adsp_init_clock(struct qcom_adsp *adsp)455{456	int ret;457 458	adsp->xo = devm_clk_get(adsp->dev, "xo");459	if (IS_ERR(adsp->xo)) {460		ret = PTR_ERR(adsp->xo);461		if (ret != -EPROBE_DEFER)462			dev_err(adsp->dev, "failed to get xo clock");463		return ret;464	}465 466	adsp->aggre2_clk = devm_clk_get_optional(adsp->dev, "aggre2");467	if (IS_ERR(adsp->aggre2_clk)) {468		ret = PTR_ERR(adsp->aggre2_clk);469		if (ret != -EPROBE_DEFER)470			dev_err(adsp->dev,471				"failed to get aggre2 clock");472		return ret;473	}474 475	return 0;476}477 478static int adsp_init_regulator(struct qcom_adsp *adsp)479{480	adsp->cx_supply = devm_regulator_get_optional(adsp->dev, "cx");481	if (IS_ERR(adsp->cx_supply)) {482		if (PTR_ERR(adsp->cx_supply) == -ENODEV)483			adsp->cx_supply = NULL;484		else485			return PTR_ERR(adsp->cx_supply);486	}487 488	if (adsp->cx_supply)489		regulator_set_load(adsp->cx_supply, 100000);490 491	adsp->px_supply = devm_regulator_get_optional(adsp->dev, "px");492	if (IS_ERR(adsp->px_supply)) {493		if (PTR_ERR(adsp->px_supply) == -ENODEV)494			adsp->px_supply = NULL;495		else496			return PTR_ERR(adsp->px_supply);497	}498 499	return 0;500}501 502static int adsp_pds_attach(struct device *dev, struct device **devs,503			   char **pd_names)504{505	size_t num_pds = 0;506	int ret;507	int i;508 509	if (!pd_names)510		return 0;511 512	/* Handle single power domain */513	if (dev->pm_domain) {514		devs[0] = dev;515		pm_runtime_enable(dev);516		return 1;517	}518 519	while (pd_names[num_pds])520		num_pds++;521 522	for (i = 0; i < num_pds; i++) {523		devs[i] = dev_pm_domain_attach_by_name(dev, pd_names[i]);524		if (IS_ERR_OR_NULL(devs[i])) {525			ret = PTR_ERR(devs[i]) ? : -ENODATA;526			goto unroll_attach;527		}528	}529 530	return num_pds;531 532unroll_attach:533	for (i--; i >= 0; i--)534		dev_pm_domain_detach(devs[i], false);535 536	return ret;537};538 539static void adsp_pds_detach(struct qcom_adsp *adsp, struct device **pds,540			    size_t pd_count)541{542	struct device *dev = adsp->dev;543	int i;544 545	/* Handle single power domain */546	if (dev->pm_domain && pd_count) {547		pm_runtime_disable(dev);548		return;549	}550 551	for (i = 0; i < pd_count; i++)552		dev_pm_domain_detach(pds[i], false);553}554 555static int adsp_alloc_memory_region(struct qcom_adsp *adsp)556{557	struct reserved_mem *rmem;558	struct device_node *node;559 560	node = of_parse_phandle(adsp->dev->of_node, "memory-region", 0);561	if (!node) {562		dev_err(adsp->dev, "no memory-region specified\n");563		return -EINVAL;564	}565 566	rmem = of_reserved_mem_lookup(node);567	of_node_put(node);568	if (!rmem) {569		dev_err(adsp->dev, "unable to resolve memory-region\n");570		return -EINVAL;571	}572 573	adsp->mem_phys = adsp->mem_reloc = rmem->base;574	adsp->mem_size = rmem->size;575	adsp->mem_region = devm_ioremap_wc(adsp->dev, adsp->mem_phys, adsp->mem_size);576	if (!adsp->mem_region) {577		dev_err(adsp->dev, "unable to map memory region: %pa+%zx\n",578			&rmem->base, adsp->mem_size);579		return -EBUSY;580	}581 582	if (!adsp->dtb_pas_id)583		return 0;584 585	node = of_parse_phandle(adsp->dev->of_node, "memory-region", 1);586	if (!node) {587		dev_err(adsp->dev, "no dtb memory-region specified\n");588		return -EINVAL;589	}590 591	rmem = of_reserved_mem_lookup(node);592	of_node_put(node);593	if (!rmem) {594		dev_err(adsp->dev, "unable to resolve dtb memory-region\n");595		return -EINVAL;596	}597 598	adsp->dtb_mem_phys = adsp->dtb_mem_reloc = rmem->base;599	adsp->dtb_mem_size = rmem->size;600	adsp->dtb_mem_region = devm_ioremap_wc(adsp->dev, adsp->dtb_mem_phys, adsp->dtb_mem_size);601	if (!adsp->dtb_mem_region) {602		dev_err(adsp->dev, "unable to map dtb memory region: %pa+%zx\n",603			&rmem->base, adsp->dtb_mem_size);604		return -EBUSY;605	}606 607	return 0;608}609 610static int adsp_assign_memory_region(struct qcom_adsp *adsp)611{612	struct qcom_scm_vmperm perm[MAX_ASSIGN_COUNT];613	struct device_node *node;614	unsigned int perm_size;615	int offset;616	int ret;617 618	if (!adsp->region_assign_idx)619		return 0;620 621	for (offset = 0; offset < adsp->region_assign_count; ++offset) {622		struct reserved_mem *rmem = NULL;623 624		node = of_parse_phandle(adsp->dev->of_node, "memory-region",625					adsp->region_assign_idx + offset);626		if (node)627			rmem = of_reserved_mem_lookup(node);628		of_node_put(node);629		if (!rmem) {630			dev_err(adsp->dev, "unable to resolve shareable memory-region index %d\n",631				offset);632			return -EINVAL;633		}634 635		if (adsp->region_assign_shared)  {636			perm[0].vmid = QCOM_SCM_VMID_HLOS;637			perm[0].perm = QCOM_SCM_PERM_RW;638			perm[1].vmid = adsp->region_assign_vmid;639			perm[1].perm = QCOM_SCM_PERM_RW;640			perm_size = 2;641		} else {642			perm[0].vmid = adsp->region_assign_vmid;643			perm[0].perm = QCOM_SCM_PERM_RW;644			perm_size = 1;645		}646 647		adsp->region_assign_phys[offset] = rmem->base;648		adsp->region_assign_size[offset] = rmem->size;649		adsp->region_assign_owners[offset] = BIT(QCOM_SCM_VMID_HLOS);650 651		ret = qcom_scm_assign_mem(adsp->region_assign_phys[offset],652					  adsp->region_assign_size[offset],653					  &adsp->region_assign_owners[offset],654					  perm, perm_size);655		if (ret < 0) {656			dev_err(adsp->dev, "assign memory %d failed\n", offset);657			return ret;658		}659	}660 661	return 0;662}663 664static void adsp_unassign_memory_region(struct qcom_adsp *adsp)665{666	struct qcom_scm_vmperm perm;667	int offset;668	int ret;669 670	if (!adsp->region_assign_idx || adsp->region_assign_shared)671		return;672 673	for (offset = 0; offset < adsp->region_assign_count; ++offset) {674		perm.vmid = QCOM_SCM_VMID_HLOS;675		perm.perm = QCOM_SCM_PERM_RW;676 677		ret = qcom_scm_assign_mem(adsp->region_assign_phys[offset],678					  adsp->region_assign_size[offset],679					  &adsp->region_assign_owners[offset],680					  &perm, 1);681		if (ret < 0)682			dev_err(adsp->dev, "unassign memory %d failed\n", offset);683	}684}685 686static int adsp_probe(struct platform_device *pdev)687{688	const struct adsp_data *desc;689	struct qcom_adsp *adsp;690	struct rproc *rproc;691	const char *fw_name, *dtb_fw_name = NULL;692	const struct rproc_ops *ops = &adsp_ops;693	int ret;694 695	desc = of_device_get_match_data(&pdev->dev);696	if (!desc)697		return -EINVAL;698 699	if (!qcom_scm_is_available())700		return -EPROBE_DEFER;701 702	fw_name = desc->firmware_name;703	ret = of_property_read_string(pdev->dev.of_node, "firmware-name",704				      &fw_name);705	if (ret < 0 && ret != -EINVAL)706		return ret;707 708	if (desc->dtb_firmware_name) {709		dtb_fw_name = desc->dtb_firmware_name;710		ret = of_property_read_string_index(pdev->dev.of_node, "firmware-name", 1,711						    &dtb_fw_name);712		if (ret < 0 && ret != -EINVAL)713			return ret;714	}715 716	if (desc->minidump_id)717		ops = &adsp_minidump_ops;718 719	rproc = devm_rproc_alloc(&pdev->dev, pdev->name, ops, fw_name, sizeof(*adsp));720 721	if (!rproc) {722		dev_err(&pdev->dev, "unable to allocate remoteproc\n");723		return -ENOMEM;724	}725 726	rproc->auto_boot = desc->auto_boot;727	rproc_coredump_set_elf_info(rproc, ELFCLASS32, EM_NONE);728 729	adsp = rproc->priv;730	adsp->dev = &pdev->dev;731	adsp->rproc = rproc;732	adsp->minidump_id = desc->minidump_id;733	adsp->pas_id = desc->pas_id;734	adsp->lite_pas_id = desc->lite_pas_id;735	adsp->info_name = desc->sysmon_name;736	adsp->smem_host_id = desc->smem_host_id;737	adsp->decrypt_shutdown = desc->decrypt_shutdown;738	adsp->region_assign_idx = desc->region_assign_idx;739	adsp->region_assign_count = min_t(int, MAX_ASSIGN_COUNT, desc->region_assign_count);740	adsp->region_assign_vmid = desc->region_assign_vmid;741	adsp->region_assign_shared = desc->region_assign_shared;742	if (dtb_fw_name) {743		adsp->dtb_firmware_name = dtb_fw_name;744		adsp->dtb_pas_id = desc->dtb_pas_id;745	}746	platform_set_drvdata(pdev, adsp);747 748	ret = device_init_wakeup(adsp->dev, true);749	if (ret)750		goto free_rproc;751 752	ret = adsp_alloc_memory_region(adsp);753	if (ret)754		goto free_rproc;755 756	ret = adsp_assign_memory_region(adsp);757	if (ret)758		goto free_rproc;759 760	ret = adsp_init_clock(adsp);761	if (ret)762		goto free_rproc;763 764	ret = adsp_init_regulator(adsp);765	if (ret)766		goto free_rproc;767 768	ret = adsp_pds_attach(&pdev->dev, adsp->proxy_pds,769			      desc->proxy_pd_names);770	if (ret < 0)771		goto free_rproc;772	adsp->proxy_pd_count = ret;773 774	ret = qcom_q6v5_init(&adsp->q6v5, pdev, rproc, desc->crash_reason_smem, desc->load_state,775			     qcom_pas_handover);776	if (ret)777		goto detach_proxy_pds;778 779	qcom_add_glink_subdev(rproc, &adsp->glink_subdev, desc->ssr_name);780	qcom_add_smd_subdev(rproc, &adsp->smd_subdev);781	qcom_add_pdm_subdev(rproc, &adsp->pdm_subdev);782	adsp->sysmon = qcom_add_sysmon_subdev(rproc,783					      desc->sysmon_name,784					      desc->ssctl_id);785	if (IS_ERR(adsp->sysmon)) {786		ret = PTR_ERR(adsp->sysmon);787		goto detach_proxy_pds;788	}789 790	qcom_add_ssr_subdev(rproc, &adsp->ssr_subdev, desc->ssr_name);791	ret = rproc_add(rproc);792	if (ret)793		goto detach_proxy_pds;794 795	return 0;796 797detach_proxy_pds:798	adsp_pds_detach(adsp, adsp->proxy_pds, adsp->proxy_pd_count);799free_rproc:800	device_init_wakeup(adsp->dev, false);801 802	return ret;803}804 805static void adsp_remove(struct platform_device *pdev)806{807	struct qcom_adsp *adsp = platform_get_drvdata(pdev);808 809	rproc_del(adsp->rproc);810 811	qcom_q6v5_deinit(&adsp->q6v5);812	adsp_unassign_memory_region(adsp);813	qcom_remove_glink_subdev(adsp->rproc, &adsp->glink_subdev);814	qcom_remove_sysmon_subdev(adsp->sysmon);815	qcom_remove_smd_subdev(adsp->rproc, &adsp->smd_subdev);816	qcom_remove_pdm_subdev(adsp->rproc, &adsp->pdm_subdev);817	qcom_remove_ssr_subdev(adsp->rproc, &adsp->ssr_subdev);818	adsp_pds_detach(adsp, adsp->proxy_pds, adsp->proxy_pd_count);819	device_init_wakeup(adsp->dev, false);820}821 822static const struct adsp_data adsp_resource_init = {823	.crash_reason_smem = 423,824	.firmware_name = "adsp.mdt",825	.pas_id = 1,826	.auto_boot = true,827	.ssr_name = "lpass",828	.sysmon_name = "adsp",829	.ssctl_id = 0x14,830};831 832static const struct adsp_data sa8775p_adsp_resource = {833	.crash_reason_smem = 423,834	.firmware_name = "adsp.mbn",835	.pas_id = 1,836	.minidump_id = 5,837	.auto_boot = true,838	.proxy_pd_names = (char*[]){839		"lcx",840		"lmx",841		NULL842	},843	.load_state = "adsp",844	.ssr_name = "lpass",845	.sysmon_name = "adsp",846	.ssctl_id = 0x14,847};848 849static const struct adsp_data sdm845_adsp_resource_init = {850	.crash_reason_smem = 423,851	.firmware_name = "adsp.mdt",852	.pas_id = 1,853	.auto_boot = true,854	.load_state = "adsp",855	.ssr_name = "lpass",856	.sysmon_name = "adsp",857	.ssctl_id = 0x14,858};859 860static const struct adsp_data sm6350_adsp_resource = {861	.crash_reason_smem = 423,862	.firmware_name = "adsp.mdt",863	.pas_id = 1,864	.auto_boot = true,865	.proxy_pd_names = (char*[]){866		"lcx",867		"lmx",868		NULL869	},870	.load_state = "adsp",871	.ssr_name = "lpass",872	.sysmon_name = "adsp",873	.ssctl_id = 0x14,874};875 876static const struct adsp_data sm6375_mpss_resource = {877	.crash_reason_smem = 421,878	.firmware_name = "modem.mdt",879	.pas_id = 4,880	.minidump_id = 3,881	.auto_boot = false,882	.proxy_pd_names = (char*[]){883		"cx",884		NULL885	},886	.ssr_name = "mpss",887	.sysmon_name = "modem",888	.ssctl_id = 0x12,889};890 891static const struct adsp_data sm8150_adsp_resource = {892	.crash_reason_smem = 423,893	.firmware_name = "adsp.mdt",894	.pas_id = 1,895	.auto_boot = true,896	.proxy_pd_names = (char*[]){897		"cx",898		NULL899	},900	.load_state = "adsp",901	.ssr_name = "lpass",902	.sysmon_name = "adsp",903	.ssctl_id = 0x14,904};905 906static const struct adsp_data sm8250_adsp_resource = {907	.crash_reason_smem = 423,908	.firmware_name = "adsp.mdt",909	.pas_id = 1,910	.auto_boot = true,911	.proxy_pd_names = (char*[]){912		"lcx",913		"lmx",914		NULL915	},916	.load_state = "adsp",917	.ssr_name = "lpass",918	.sysmon_name = "adsp",919	.ssctl_id = 0x14,920};921 922static const struct adsp_data sm8350_adsp_resource = {923	.crash_reason_smem = 423,924	.firmware_name = "adsp.mdt",925	.pas_id = 1,926	.auto_boot = true,927	.proxy_pd_names = (char*[]){928		"lcx",929		"lmx",930		NULL931	},932	.load_state = "adsp",933	.ssr_name = "lpass",934	.sysmon_name = "adsp",935	.ssctl_id = 0x14,936};937 938static const struct adsp_data msm8996_adsp_resource = {939	.crash_reason_smem = 423,940	.firmware_name = "adsp.mdt",941	.pas_id = 1,942	.auto_boot = true,943	.proxy_pd_names = (char*[]){944		"cx",945		NULL946	},947	.ssr_name = "lpass",948	.sysmon_name = "adsp",949	.ssctl_id = 0x14,950};951 952static const struct adsp_data cdsp_resource_init = {953	.crash_reason_smem = 601,954	.firmware_name = "cdsp.mdt",955	.pas_id = 18,956	.auto_boot = true,957	.ssr_name = "cdsp",958	.sysmon_name = "cdsp",959	.ssctl_id = 0x17,960};961 962static const struct adsp_data sa8775p_cdsp0_resource = {963	.crash_reason_smem = 601,964	.firmware_name = "cdsp0.mbn",965	.pas_id = 18,966	.minidump_id = 7,967	.auto_boot = true,968	.proxy_pd_names = (char*[]){969		"cx",970		"mxc",971		"nsp",972		NULL973	},974	.load_state = "cdsp",975	.ssr_name = "cdsp",976	.sysmon_name = "cdsp",977	.ssctl_id = 0x17,978};979 980static const struct adsp_data sa8775p_cdsp1_resource = {981	.crash_reason_smem = 633,982	.firmware_name = "cdsp1.mbn",983	.pas_id = 30,984	.minidump_id = 20,985	.auto_boot = true,986	.proxy_pd_names = (char*[]){987		"cx",988		"mxc",989		"nsp",990		NULL991	},992	.load_state = "nsp",993	.ssr_name = "cdsp1",994	.sysmon_name = "cdsp1",995	.ssctl_id = 0x20,996};997 998static const struct adsp_data sdm845_cdsp_resource_init = {999	.crash_reason_smem = 601,1000	.firmware_name = "cdsp.mdt",1001	.pas_id = 18,1002	.auto_boot = true,1003	.load_state = "cdsp",1004	.ssr_name = "cdsp",1005	.sysmon_name = "cdsp",1006	.ssctl_id = 0x17,1007};1008 1009static const struct adsp_data sm6350_cdsp_resource = {1010	.crash_reason_smem = 601,1011	.firmware_name = "cdsp.mdt",1012	.pas_id = 18,1013	.auto_boot = true,1014	.proxy_pd_names = (char*[]){1015		"cx",1016		"mx",1017		NULL1018	},1019	.load_state = "cdsp",1020	.ssr_name = "cdsp",1021	.sysmon_name = "cdsp",1022	.ssctl_id = 0x17,1023};1024 1025static const struct adsp_data sm8150_cdsp_resource = {1026	.crash_reason_smem = 601,1027	.firmware_name = "cdsp.mdt",1028	.pas_id = 18,1029	.auto_boot = true,1030	.proxy_pd_names = (char*[]){1031		"cx",1032		NULL1033	},1034	.load_state = "cdsp",1035	.ssr_name = "cdsp",1036	.sysmon_name = "cdsp",1037	.ssctl_id = 0x17,1038};1039 1040static const struct adsp_data sm8250_cdsp_resource = {1041	.crash_reason_smem = 601,1042	.firmware_name = "cdsp.mdt",1043	.pas_id = 18,1044	.auto_boot = true,1045	.proxy_pd_names = (char*[]){1046		"cx",1047		NULL1048	},1049	.load_state = "cdsp",1050	.ssr_name = "cdsp",1051	.sysmon_name = "cdsp",1052	.ssctl_id = 0x17,1053};1054 1055static const struct adsp_data sc8280xp_nsp0_resource = {1056	.crash_reason_smem = 601,1057	.firmware_name = "cdsp.mdt",1058	.pas_id = 18,1059	.auto_boot = true,1060	.proxy_pd_names = (char*[]){1061		"nsp",1062		NULL1063	},1064	.ssr_name = "cdsp0",1065	.sysmon_name = "cdsp",1066	.ssctl_id = 0x17,1067};1068 1069static const struct adsp_data sc8280xp_nsp1_resource = {1070	.crash_reason_smem = 633,1071	.firmware_name = "cdsp.mdt",1072	.pas_id = 30,1073	.auto_boot = true,1074	.proxy_pd_names = (char*[]){1075		"nsp",1076		NULL1077	},1078	.ssr_name = "cdsp1",1079	.sysmon_name = "cdsp1",1080	.ssctl_id = 0x20,1081};1082 1083static const struct adsp_data x1e80100_adsp_resource = {1084	.crash_reason_smem = 423,1085	.firmware_name = "adsp.mdt",1086	.dtb_firmware_name = "adsp_dtb.mdt",1087	.pas_id = 1,1088	.dtb_pas_id = 0x24,1089	.lite_pas_id = 0x1f,1090	.minidump_id = 5,1091	.auto_boot = true,1092	.proxy_pd_names = (char*[]){1093		"lcx",1094		"lmx",1095		NULL1096	},1097	.load_state = "adsp",1098	.ssr_name = "lpass",1099	.sysmon_name = "adsp",1100	.ssctl_id = 0x14,1101};1102 1103static const struct adsp_data x1e80100_cdsp_resource = {1104	.crash_reason_smem = 601,1105	.firmware_name = "cdsp.mdt",1106	.dtb_firmware_name = "cdsp_dtb.mdt",1107	.pas_id = 18,1108	.dtb_pas_id = 0x25,1109	.minidump_id = 7,1110	.auto_boot = true,1111	.proxy_pd_names = (char*[]){1112		"cx",1113		"mxc",1114		"nsp",1115		NULL1116	},1117	.load_state = "cdsp",1118	.ssr_name = "cdsp",1119	.sysmon_name = "cdsp",1120	.ssctl_id = 0x17,1121};1122 1123static const struct adsp_data sm8350_cdsp_resource = {1124	.crash_reason_smem = 601,1125	.firmware_name = "cdsp.mdt",1126	.pas_id = 18,1127	.auto_boot = true,1128	.proxy_pd_names = (char*[]){1129		"cx",1130		"mxc",1131		NULL1132	},1133	.load_state = "cdsp",1134	.ssr_name = "cdsp",1135	.sysmon_name = "cdsp",1136	.ssctl_id = 0x17,1137};1138 1139static const struct adsp_data sa8775p_gpdsp0_resource = {1140	.crash_reason_smem = 640,1141	.firmware_name = "gpdsp0.mbn",1142	.pas_id = 39,1143	.minidump_id = 21,1144	.auto_boot = true,1145	.proxy_pd_names = (char*[]){1146		"cx",1147		"mxc",1148		NULL1149	},1150	.load_state = "gpdsp0",1151	.ssr_name = "gpdsp0",1152	.sysmon_name = "gpdsp0",1153	.ssctl_id = 0x21,1154};1155 1156static const struct adsp_data sa8775p_gpdsp1_resource = {1157	.crash_reason_smem = 641,1158	.firmware_name = "gpdsp1.mbn",1159	.pas_id = 40,1160	.minidump_id = 22,1161	.auto_boot = true,1162	.proxy_pd_names = (char*[]){1163		"cx",1164		"mxc",1165		NULL1166	},1167	.load_state = "gpdsp1",1168	.ssr_name = "gpdsp1",1169	.sysmon_name = "gpdsp1",1170	.ssctl_id = 0x22,1171};1172 1173static const struct adsp_data mpss_resource_init = {1174	.crash_reason_smem = 421,1175	.firmware_name = "modem.mdt",1176	.pas_id = 4,1177	.minidump_id = 3,1178	.auto_boot = false,1179	.proxy_pd_names = (char*[]){1180		"cx",1181		"mss",1182		NULL1183	},1184	.load_state = "modem",1185	.ssr_name = "mpss",1186	.sysmon_name = "modem",1187	.ssctl_id = 0x12,1188};1189 1190static const struct adsp_data sc8180x_mpss_resource = {1191	.crash_reason_smem = 421,1192	.firmware_name = "modem.mdt",1193	.pas_id = 4,1194	.auto_boot = false,1195	.proxy_pd_names = (char*[]){1196		"cx",1197		NULL1198	},1199	.load_state = "modem",1200	.ssr_name = "mpss",1201	.sysmon_name = "modem",1202	.ssctl_id = 0x12,1203};1204 1205static const struct adsp_data msm8996_slpi_resource_init = {1206	.crash_reason_smem = 424,1207	.firmware_name = "slpi.mdt",1208	.pas_id = 12,1209	.auto_boot = true,1210	.proxy_pd_names = (char*[]){1211		"ssc_cx",1212		NULL1213	},1214	.ssr_name = "dsps",1215	.sysmon_name = "slpi",1216	.ssctl_id = 0x16,1217};1218 1219static const struct adsp_data sdm845_slpi_resource_init = {1220	.crash_reason_smem = 424,1221	.firmware_name = "slpi.mdt",1222	.pas_id = 12,1223	.auto_boot = true,1224	.proxy_pd_names = (char*[]){1225		"lcx",1226		"lmx",1227		NULL1228	},1229	.load_state = "slpi",1230	.ssr_name = "dsps",1231	.sysmon_name = "slpi",1232	.ssctl_id = 0x16,1233};1234 1235static const struct adsp_data wcss_resource_init = {1236	.crash_reason_smem = 421,1237	.firmware_name = "wcnss.mdt",1238	.pas_id = 6,1239	.auto_boot = true,1240	.ssr_name = "mpss",1241	.sysmon_name = "wcnss",1242	.ssctl_id = 0x12,1243};1244 1245static const struct adsp_data sdx55_mpss_resource = {1246	.crash_reason_smem = 421,1247	.firmware_name = "modem.mdt",1248	.pas_id = 4,1249	.auto_boot = true,1250	.proxy_pd_names = (char*[]){1251		"cx",1252		"mss",1253		NULL1254	},1255	.ssr_name = "mpss",1256	.sysmon_name = "modem",1257	.ssctl_id = 0x22,1258};1259 1260static const struct adsp_data sm8450_mpss_resource = {1261	.crash_reason_smem = 421,1262	.firmware_name = "modem.mdt",1263	.pas_id = 4,1264	.minidump_id = 3,1265	.auto_boot = false,1266	.decrypt_shutdown = true,1267	.proxy_pd_names = (char*[]){1268		"cx",1269		"mss",1270		NULL1271	},1272	.load_state = "modem",1273	.ssr_name = "mpss",1274	.sysmon_name = "modem",1275	.ssctl_id = 0x12,1276};1277 1278static const struct adsp_data sm8550_adsp_resource = {1279	.crash_reason_smem = 423,1280	.firmware_name = "adsp.mdt",1281	.dtb_firmware_name = "adsp_dtb.mdt",1282	.pas_id = 1,1283	.dtb_pas_id = 0x24,1284	.minidump_id = 5,1285	.auto_boot = true,1286	.proxy_pd_names = (char*[]){1287		"lcx",1288		"lmx",1289		NULL1290	},1291	.load_state = "adsp",1292	.ssr_name = "lpass",1293	.sysmon_name = "adsp",1294	.ssctl_id = 0x14,1295	.smem_host_id = 2,1296};1297 1298static const struct adsp_data sm8550_cdsp_resource = {1299	.crash_reason_smem = 601,1300	.firmware_name = "cdsp.mdt",1301	.dtb_firmware_name = "cdsp_dtb.mdt",1302	.pas_id = 18,1303	.dtb_pas_id = 0x25,1304	.minidump_id = 7,1305	.auto_boot = true,1306	.proxy_pd_names = (char*[]){1307		"cx",1308		"mxc",1309		"nsp",1310		NULL1311	},1312	.load_state = "cdsp",1313	.ssr_name = "cdsp",1314	.sysmon_name = "cdsp",1315	.ssctl_id = 0x17,1316	.smem_host_id = 5,1317};1318 1319static const struct adsp_data sm8550_mpss_resource = {1320	.crash_reason_smem = 421,1321	.firmware_name = "modem.mdt",1322	.dtb_firmware_name = "modem_dtb.mdt",1323	.pas_id = 4,1324	.dtb_pas_id = 0x26,1325	.minidump_id = 3,1326	.auto_boot = false,1327	.decrypt_shutdown = true,1328	.proxy_pd_names = (char*[]){1329		"cx",1330		"mss",1331		NULL1332	},1333	.load_state = "modem",1334	.ssr_name = "mpss",1335	.sysmon_name = "modem",1336	.ssctl_id = 0x12,1337	.smem_host_id = 1,1338	.region_assign_idx = 2,1339	.region_assign_count = 1,1340	.region_assign_vmid = QCOM_SCM_VMID_MSS_MSA,1341};1342 1343static const struct adsp_data sc7280_wpss_resource = {1344	.crash_reason_smem = 626,1345	.firmware_name = "wpss.mdt",1346	.pas_id = 6,1347	.auto_boot = true,1348	.proxy_pd_names = (char*[]){1349		"cx",1350		"mx",1351		NULL1352	},1353	.load_state = "wpss",1354	.ssr_name = "wpss",1355	.sysmon_name = "wpss",1356	.ssctl_id = 0x19,1357};1358 1359static const struct adsp_data sm8650_cdsp_resource = {1360	.crash_reason_smem = 601,1361	.firmware_name = "cdsp.mdt",1362	.dtb_firmware_name = "cdsp_dtb.mdt",1363	.pas_id = 18,1364	.dtb_pas_id = 0x25,1365	.minidump_id = 7,1366	.auto_boot = true,1367	.proxy_pd_names = (char*[]){1368		"cx",1369		"mxc",1370		"nsp",1371		NULL1372	},1373	.load_state = "cdsp",1374	.ssr_name = "cdsp",1375	.sysmon_name = "cdsp",1376	.ssctl_id = 0x17,1377	.smem_host_id = 5,1378	.region_assign_idx = 2,1379	.region_assign_count = 1,1380	.region_assign_shared = true,1381	.region_assign_vmid = QCOM_SCM_VMID_CDSP,1382};1383 1384static const struct adsp_data sm8650_mpss_resource = {1385	.crash_reason_smem = 421,1386	.firmware_name = "modem.mdt",1387	.dtb_firmware_name = "modem_dtb.mdt",1388	.pas_id = 4,1389	.dtb_pas_id = 0x26,1390	.minidump_id = 3,1391	.auto_boot = false,1392	.decrypt_shutdown = true,1393	.proxy_pd_names = (char*[]){1394		"cx",1395		"mss",1396		NULL1397	},1398	.load_state = "modem",1399	.ssr_name = "mpss",1400	.sysmon_name = "modem",1401	.ssctl_id = 0x12,1402	.smem_host_id = 1,1403	.region_assign_idx = 2,1404	.region_assign_count = 3,1405	.region_assign_vmid = QCOM_SCM_VMID_MSS_MSA,1406};1407 1408static const struct of_device_id adsp_of_match[] = {1409	{ .compatible = "qcom,msm8226-adsp-pil", .data = &adsp_resource_init},1410	{ .compatible = "qcom,msm8953-adsp-pil", .data = &msm8996_adsp_resource},1411	{ .compatible = "qcom,msm8974-adsp-pil", .data = &adsp_resource_init},1412	{ .compatible = "qcom,msm8996-adsp-pil", .data = &msm8996_adsp_resource},1413	{ .compatible = "qcom,msm8996-slpi-pil", .data = &msm8996_slpi_resource_init},1414	{ .compatible = "qcom,msm8998-adsp-pas", .data = &msm8996_adsp_resource},1415	{ .compatible = "qcom,msm8998-slpi-pas", .data = &msm8996_slpi_resource_init},1416	{ .compatible = "qcom,qcs404-adsp-pas", .data = &adsp_resource_init },1417	{ .compatible = "qcom,qcs404-cdsp-pas", .data = &cdsp_resource_init },1418	{ .compatible = "qcom,qcs404-wcss-pas", .data = &wcss_resource_init },1419	{ .compatible = "qcom,sa8775p-adsp-pas", .data = &sa8775p_adsp_resource},1420	{ .compatible = "qcom,sa8775p-cdsp0-pas", .data = &sa8775p_cdsp0_resource},1421	{ .compatible = "qcom,sa8775p-cdsp1-pas", .data = &sa8775p_cdsp1_resource},1422	{ .compatible = "qcom,sa8775p-gpdsp0-pas", .data = &sa8775p_gpdsp0_resource},1423	{ .compatible = "qcom,sa8775p-gpdsp1-pas", .data = &sa8775p_gpdsp1_resource},1424	{ .compatible = "qcom,sc7180-adsp-pas", .data = &sm8250_adsp_resource},1425	{ .compatible = "qcom,sc7180-mpss-pas", .data = &mpss_resource_init},1426	{ .compatible = "qcom,sc7280-adsp-pas", .data = &sm8350_adsp_resource},1427	{ .compatible = "qcom,sc7280-cdsp-pas", .data = &sm6350_cdsp_resource},1428	{ .compatible = "qcom,sc7280-mpss-pas", .data = &mpss_resource_init},1429	{ .compatible = "qcom,sc7280-wpss-pas", .data = &sc7280_wpss_resource},1430	{ .compatible = "qcom,sc8180x-adsp-pas", .data = &sm8150_adsp_resource},1431	{ .compatible = "qcom,sc8180x-cdsp-pas", .data = &sm8150_cdsp_resource},1432	{ .compatible = "qcom,sc8180x-mpss-pas", .data = &sc8180x_mpss_resource},1433	{ .compatible = "qcom,sc8280xp-adsp-pas", .data = &sm8250_adsp_resource},1434	{ .compatible = "qcom,sc8280xp-nsp0-pas", .data = &sc8280xp_nsp0_resource},1435	{ .compatible = "qcom,sc8280xp-nsp1-pas", .data = &sc8280xp_nsp1_resource},1436	{ .compatible = "qcom,sdm660-adsp-pas", .data = &adsp_resource_init},1437	{ .compatible = "qcom,sdm845-adsp-pas", .data = &sdm845_adsp_resource_init},1438	{ .compatible = "qcom,sdm845-cdsp-pas", .data = &sdm845_cdsp_resource_init},1439	{ .compatible = "qcom,sdm845-slpi-pas", .data = &sdm845_slpi_resource_init},1440	{ .compatible = "qcom,sdx55-mpss-pas", .data = &sdx55_mpss_resource},1441	{ .compatible = "qcom,sdx75-mpss-pas", .data = &sm8650_mpss_resource},1442	{ .compatible = "qcom,sm6115-adsp-pas", .data = &adsp_resource_init},1443	{ .compatible = "qcom,sm6115-cdsp-pas", .data = &cdsp_resource_init},1444	{ .compatible = "qcom,sm6115-mpss-pas", .data = &sc8180x_mpss_resource},1445	{ .compatible = "qcom,sm6350-adsp-pas", .data = &sm6350_adsp_resource},1446	{ .compatible = "qcom,sm6350-cdsp-pas", .data = &sm6350_cdsp_resource},1447	{ .compatible = "qcom,sm6350-mpss-pas", .data = &mpss_resource_init},1448	{ .compatible = "qcom,sm6375-adsp-pas", .data = &sm6350_adsp_resource},1449	{ .compatible = "qcom,sm6375-cdsp-pas", .data = &sm8150_cdsp_resource},1450	{ .compatible = "qcom,sm6375-mpss-pas", .data = &sm6375_mpss_resource},1451	{ .compatible = "qcom,sm8150-adsp-pas", .data = &sm8150_adsp_resource},1452	{ .compatible = "qcom,sm8150-cdsp-pas", .data = &sm8150_cdsp_resource},1453	{ .compatible = "qcom,sm8150-mpss-pas", .data = &mpss_resource_init},1454	{ .compatible = "qcom,sm8150-slpi-pas", .data = &sdm845_slpi_resource_init},1455	{ .compatible = "qcom,sm8250-adsp-pas", .data = &sm8250_adsp_resource},1456	{ .compatible = "qcom,sm8250-cdsp-pas", .data = &sm8250_cdsp_resource},1457	{ .compatible = "qcom,sm8250-slpi-pas", .data = &sdm845_slpi_resource_init},1458	{ .compatible = "qcom,sm8350-adsp-pas", .data = &sm8350_adsp_resource},1459	{ .compatible = "qcom,sm8350-cdsp-pas", .data = &sm8350_cdsp_resource},1460	{ .compatible = "qcom,sm8350-slpi-pas", .data = &sdm845_slpi_resource_init},1461	{ .compatible = "qcom,sm8350-mpss-pas", .data = &mpss_resource_init},1462	{ .compatible = "qcom,sm8450-adsp-pas", .data = &sm8350_adsp_resource},1463	{ .compatible = "qcom,sm8450-cdsp-pas", .data = &sm8350_cdsp_resource},1464	{ .compatible = "qcom,sm8450-slpi-pas", .data = &sdm845_slpi_resource_init},1465	{ .compatible = "qcom,sm8450-mpss-pas", .data = &sm8450_mpss_resource},1466	{ .compatible = "qcom,sm8550-adsp-pas", .data = &sm8550_adsp_resource},1467	{ .compatible = "qcom,sm8550-cdsp-pas", .data = &sm8550_cdsp_resource},1468	{ .compatible = "qcom,sm8550-mpss-pas", .data = &sm8550_mpss_resource},1469	{ .compatible = "qcom,sm8650-adsp-pas", .data = &sm8550_adsp_resource},1470	{ .compatible = "qcom,sm8650-cdsp-pas", .data = &sm8650_cdsp_resource},1471	{ .compatible = "qcom,sm8650-mpss-pas", .data = &sm8650_mpss_resource},1472	{ .compatible = "qcom,x1e80100-adsp-pas", .data = &x1e80100_adsp_resource},1473	{ .compatible = "qcom,x1e80100-cdsp-pas", .data = &x1e80100_cdsp_resource},1474	{ },1475};1476MODULE_DEVICE_TABLE(of, adsp_of_match);1477 1478static struct platform_driver adsp_driver = {1479	.probe = adsp_probe,1480	.remove_new = adsp_remove,1481	.driver = {1482		.name = "qcom_q6v5_pas",1483		.of_match_table = adsp_of_match,1484	},1485};1486 1487module_platform_driver(adsp_driver);1488MODULE_DESCRIPTION("Qualcomm Hexagon v5 Peripheral Authentication Service driver");1489MODULE_LICENSE("GPL v2");1490