mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 18:43:33 +02:00
iommu/arm-smmu-qcom: Register the TBU driver in qcom_smmu_impl_init
Currently the TBU driver will only probe when CONFIG_ARM_SMMU_QCOM_DEBUG
is enabled. The driver not probing would prevent the platform to reach
sync_state and the system will remain in sub-optimal power consumption
mode while waiting for all consumer drivers to probe. To address this,
let's register the TBU driver in qcom_smmu_impl_init(), so that it can
probe, but still enable its functionality only when the debug option in
Kconfig is enabled.
Reported-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Closes: https://lore.kernel.org/r/CAA8EJppcXVu72OSo+OiYEiC1HQjP3qCwKMumOsUhcn6Czj0URg@mail.gmail.com
Fixes: 414ecb0308 ("iommu/arm-smmu-qcom-debug: Add support for TBUs")
Signed-off-by: Georgi Djakov <quic_c_gdjako@quicinc.com>
Link: https://lore.kernel.org/r/20240704010759.507798-1-quic_c_gdjako@quicinc.com
Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
25c776dd03
commit
0b4eeee287
|
|
@ -464,7 +464,7 @@ irqreturn_t qcom_smmu_context_fault(int irq, void *dev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qcom_tbu_probe(struct platform_device *pdev)
|
int qcom_tbu_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct of_phandle_args args = { .args_count = 2 };
|
struct of_phandle_args args = { .args_count = 2 };
|
||||||
struct device_node *np = pdev->dev.of_node;
|
struct device_node *np = pdev->dev.of_node;
|
||||||
|
|
@ -506,18 +506,3 @@ static int qcom_tbu_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct of_device_id qcom_tbu_of_match[] = {
|
|
||||||
{ .compatible = "qcom,sc7280-tbu" },
|
|
||||||
{ .compatible = "qcom,sdm845-tbu" },
|
|
||||||
{ }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_driver qcom_tbu_driver = {
|
|
||||||
.driver = {
|
|
||||||
.name = "qcom_tbu",
|
|
||||||
.of_match_table = qcom_tbu_of_match,
|
|
||||||
},
|
|
||||||
.probe = qcom_tbu_probe,
|
|
||||||
};
|
|
||||||
builtin_platform_driver(qcom_tbu_driver);
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of_device.h>
|
||||||
#include <linux/firmware/qcom/qcom_scm.h>
|
#include <linux/firmware/qcom/qcom_scm.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/pm_runtime.h>
|
||||||
|
|
||||||
#include "arm-smmu.h"
|
#include "arm-smmu.h"
|
||||||
#include "arm-smmu-qcom.h"
|
#include "arm-smmu-qcom.h"
|
||||||
|
|
@ -562,10 +564,47 @@ static struct acpi_platform_list qcom_acpi_platlist[] = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int qcom_smmu_tbu_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct device *dev = &pdev->dev;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (IS_ENABLED(CONFIG_ARM_SMMU_QCOM_DEBUG)) {
|
||||||
|
ret = qcom_tbu_probe(pdev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dev->pm_domain) {
|
||||||
|
pm_runtime_set_active(dev);
|
||||||
|
pm_runtime_enable(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct of_device_id qcom_smmu_tbu_of_match[] = {
|
||||||
|
{ .compatible = "qcom,sc7280-tbu" },
|
||||||
|
{ .compatible = "qcom,sdm845-tbu" },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_driver qcom_smmu_tbu_driver = {
|
||||||
|
.driver = {
|
||||||
|
.name = "qcom_tbu",
|
||||||
|
.of_match_table = qcom_smmu_tbu_of_match,
|
||||||
|
},
|
||||||
|
.probe = qcom_smmu_tbu_probe,
|
||||||
|
};
|
||||||
|
|
||||||
struct arm_smmu_device *qcom_smmu_impl_init(struct arm_smmu_device *smmu)
|
struct arm_smmu_device *qcom_smmu_impl_init(struct arm_smmu_device *smmu)
|
||||||
{
|
{
|
||||||
const struct device_node *np = smmu->dev->of_node;
|
const struct device_node *np = smmu->dev->of_node;
|
||||||
const struct of_device_id *match;
|
const struct of_device_id *match;
|
||||||
|
static u8 tbu_registered;
|
||||||
|
|
||||||
|
if (!tbu_registered++)
|
||||||
|
platform_driver_register(&qcom_smmu_tbu_driver);
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI
|
#ifdef CONFIG_ACPI
|
||||||
if (np == NULL) {
|
if (np == NULL) {
|
||||||
|
|
|
||||||
|
|
@ -34,8 +34,10 @@ irqreturn_t qcom_smmu_context_fault(int irq, void *dev);
|
||||||
|
|
||||||
#ifdef CONFIG_ARM_SMMU_QCOM_DEBUG
|
#ifdef CONFIG_ARM_SMMU_QCOM_DEBUG
|
||||||
void qcom_smmu_tlb_sync_debug(struct arm_smmu_device *smmu);
|
void qcom_smmu_tlb_sync_debug(struct arm_smmu_device *smmu);
|
||||||
|
int qcom_tbu_probe(struct platform_device *pdev);
|
||||||
#else
|
#else
|
||||||
static inline void qcom_smmu_tlb_sync_debug(struct arm_smmu_device *smmu) { }
|
static inline void qcom_smmu_tlb_sync_debug(struct arm_smmu_device *smmu) { }
|
||||||
|
static inline int qcom_tbu_probe(struct platform_device *pdev) { return -EINVAL; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _ARM_SMMU_QCOM_H */
|
#endif /* _ARM_SMMU_QCOM_H */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user