coresight: etm4x: Refactor probing routine
CoreSight ETM with system register access may not have a memory mapped i/o access. Refactor the ETM specific probing into a common routine to allow reusing the code for such ETMs. Link: https://lore.kernel.org/r/20210110224850.1880240-24-suzuki.poulose@arm.com Cc: Mike Leach <mike.leach@linaro.org> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> Link: https://lore.kernel.org/r/20210201181351.1475223-26-mathieu.poirier@linaro.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									dc1747a716
								
							
						
					
					
						commit
						c23bc382ef
					
				| @ -1708,14 +1708,11 @@ static void etm4_pm_clear(void) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static int etm4_probe(struct amba_device *adev, const struct amba_id *id) | ||||
| static int etm4_probe(struct device *dev, void __iomem *base, u32 etm_pid) | ||||
| { | ||||
| 	int ret; | ||||
| 	void __iomem *base; | ||||
| 	struct device *dev = &adev->dev; | ||||
| 	struct coresight_platform_data *pdata = NULL; | ||||
| 	struct etmv4_drvdata *drvdata; | ||||
| 	struct resource *res = &adev->res; | ||||
| 	struct coresight_desc desc = { 0 }; | ||||
| 	struct etm4_init_arg init_arg = { 0 }; | ||||
| 
 | ||||
| @ -1739,11 +1736,6 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id) | ||||
| 	if (fwnode_property_present(dev_fwnode(dev), "qcom,skip-power-up")) | ||||
| 		drvdata->skip_power_up = true; | ||||
| 
 | ||||
| 	/* Validity for the resource is already checked by the AMBA core */ | ||||
| 	base = devm_ioremap_resource(dev, res); | ||||
| 	if (IS_ERR(base)) | ||||
| 		return PTR_ERR(base); | ||||
| 
 | ||||
| 	drvdata->base = base; | ||||
| 
 | ||||
| 	spin_lock_init(&drvdata->spinlock); | ||||
| @ -1773,7 +1765,7 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id) | ||||
| 	if (IS_ERR(pdata)) | ||||
| 		return PTR_ERR(pdata); | ||||
| 
 | ||||
| 	adev->dev.platform_data = pdata; | ||||
| 	dev->platform_data = pdata; | ||||
| 
 | ||||
| 	desc.type = CORESIGHT_DEV_TYPE_SOURCE; | ||||
| 	desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC; | ||||
| @ -1793,7 +1785,6 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id) | ||||
| 
 | ||||
| 	etmdrvdata[drvdata->cpu] = drvdata; | ||||
| 
 | ||||
| 	pm_runtime_put(&adev->dev); | ||||
| 	dev_info(&drvdata->csdev->dev, "CPU%d: ETM v%d.%d initialized\n", | ||||
| 		 drvdata->cpu, ETM_ARCH_MAJOR_VERSION(drvdata->arch), | ||||
| 		 ETM_ARCH_MINOR_VERSION(drvdata->arch)); | ||||
| @ -1803,11 +1794,30 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id) | ||||
| 		drvdata->boot_enable = true; | ||||
| 	} | ||||
| 
 | ||||
| 	etm4_check_arch_features(drvdata, id->id); | ||||
| 	etm4_check_arch_features(drvdata, etm_pid); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int etm4_probe_amba(struct amba_device *adev, const struct amba_id *id) | ||||
| { | ||||
| 	void __iomem *base; | ||||
| 	struct device *dev = &adev->dev; | ||||
| 	struct resource *res = &adev->res; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	/* Validity for the resource is already checked by the AMBA core */ | ||||
| 	base = devm_ioremap_resource(dev, res); | ||||
| 	if (IS_ERR(base)) | ||||
| 		return PTR_ERR(base); | ||||
| 
 | ||||
| 	ret = etm4_probe(dev, base, id->id); | ||||
| 	if (!ret) | ||||
| 		pm_runtime_put(&adev->dev); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static struct amba_cs_uci_id uci_id_etm4[] = { | ||||
| 	{ | ||||
| 		/*  ETMv4 UCI data */ | ||||
| @ -1824,15 +1834,12 @@ static void clear_etmdrvdata(void *info) | ||||
| 	etmdrvdata[cpu] = NULL; | ||||
| } | ||||
| 
 | ||||
| static int etm4_remove(struct amba_device *adev) | ||||
| static int __exit etm4_remove_dev(struct etmv4_drvdata *drvdata) | ||||
| { | ||||
| 	struct etmv4_drvdata *drvdata = dev_get_drvdata(&adev->dev); | ||||
| 
 | ||||
| 	etm_perf_symlink(drvdata->csdev, false); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Taking hotplug lock here to avoid racing between etm4_remove and | ||||
| 	 * CPU hotplug call backs. | ||||
| 	 * Taking hotplug lock here to avoid racing between etm4_remove_dev() | ||||
| 	 * and CPU hotplug call backs. | ||||
| 	 */ | ||||
| 	cpus_read_lock(); | ||||
| 	/*
 | ||||
| @ -1851,6 +1858,15 @@ static int etm4_remove(struct amba_device *adev) | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int __exit etm4_remove_amba(struct amba_device *adev) | ||||
| { | ||||
| 	struct etmv4_drvdata *drvdata = dev_get_drvdata(&adev->dev); | ||||
| 
 | ||||
| 	if (drvdata) | ||||
| 		return etm4_remove_dev(drvdata); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static const struct amba_id etm4_ids[] = { | ||||
| 	CS_AMBA_ID(0x000bb95d),			/* Cortex-A53 */ | ||||
| 	CS_AMBA_ID(0x000bb95e),			/* Cortex-A57 */ | ||||
| @ -1874,14 +1890,14 @@ static const struct amba_id etm4_ids[] = { | ||||
| 
 | ||||
| MODULE_DEVICE_TABLE(amba, etm4_ids); | ||||
| 
 | ||||
| static struct amba_driver etm4x_driver = { | ||||
| static struct amba_driver etm4x_amba_driver = { | ||||
| 	.drv = { | ||||
| 		.name   = "coresight-etm4x", | ||||
| 		.owner  = THIS_MODULE, | ||||
| 		.suppress_bind_attrs = true, | ||||
| 	}, | ||||
| 	.probe		= etm4_probe, | ||||
| 	.remove         = etm4_remove, | ||||
| 	.probe		= etm4_probe_amba, | ||||
| 	.remove         = etm4_remove_amba, | ||||
| 	.id_table	= etm4_ids, | ||||
| }; | ||||
| 
 | ||||
| @ -1895,7 +1911,7 @@ static int __init etm4x_init(void) | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	ret = amba_driver_register(&etm4x_driver); | ||||
| 	ret = amba_driver_register(&etm4x_amba_driver); | ||||
| 	if (ret) { | ||||
| 		pr_err("Error registering etm4x driver\n"); | ||||
| 		etm4_pm_clear(); | ||||
| @ -1906,7 +1922,7 @@ static int __init etm4x_init(void) | ||||
| 
 | ||||
| static void __exit etm4x_exit(void) | ||||
| { | ||||
| 	amba_driver_unregister(&etm4x_driver); | ||||
| 	amba_driver_unregister(&etm4x_amba_driver); | ||||
| 	etm4_pm_clear(); | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user