Skip to content

Commit

Permalink
remoteproc: qcom_wcnss: Fix circular module dependency
Browse files Browse the repository at this point in the history
The tie between the main WCNSS driver and the IRIS driver causes a
circular dependency between the two modules. Neither part makes sense to
have on their own so lets merge them into one module.

For the sake of picking up the clock and regulator resources described
in the iris of_node we need an associated struct device. But, to keep
the size of the patch down we continue to represent the IRIS part as its
own platform_driver, within the same module, rather than setting up a
dummy device.

Fixes: aed361a ("remoteproc: qcom: Introduce WCNSS peripheral image loader")
Reported-by: Andreas Färber <afaerber@suse.de>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
  • Loading branch information
Bjorn Andersson committed Nov 15, 2016
1 parent cda8529 commit 6de1a50
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 16 deletions.
5 changes: 0 additions & 5 deletions drivers/remoteproc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -91,17 +91,12 @@ config QCOM_Q6V5_PIL
Say y here to support the Qualcomm Peripherial Image Loader for the
Hexagon V5 based remote processors.

config QCOM_WCNSS_IRIS
tristate
depends on OF && ARCH_QCOM

config QCOM_WCNSS_PIL
tristate "Qualcomm WCNSS Peripheral Image Loader"
depends on OF && ARCH_QCOM
depends on QCOM_SMEM
select QCOM_MDT_LOADER
select QCOM_SCM
select QCOM_WCNSS_IRIS
select REMOTEPROC
help
Say y here to support the Peripheral Image Loader for the Qualcomm
Expand Down
5 changes: 3 additions & 2 deletions drivers/remoteproc/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ obj-$(CONFIG_WKUP_M3_RPROC) += wkup_m3_rproc.o
obj-$(CONFIG_DA8XX_REMOTEPROC) += da8xx_remoteproc.o
obj-$(CONFIG_QCOM_MDT_LOADER) += qcom_mdt_loader.o
obj-$(CONFIG_QCOM_Q6V5_PIL) += qcom_q6v5_pil.o
obj-$(CONFIG_QCOM_WCNSS_IRIS) += qcom_wcnss_iris.o
obj-$(CONFIG_QCOM_WCNSS_PIL) += qcom_wcnss.o
obj-$(CONFIG_QCOM_WCNSS_PIL) += qcom_wcnss_pil.o
qcom_wcnss_pil-y += qcom_wcnss.o
qcom_wcnss_pil-y += qcom_wcnss_iris.o
obj-$(CONFIG_ST_REMOTEPROC) += st_remoteproc.o
25 changes: 23 additions & 2 deletions drivers/remoteproc/qcom_wcnss.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,6 @@ void qcom_wcnss_assign_iris(struct qcom_wcnss *wcnss,

mutex_unlock(&wcnss->iris_lock);
}
EXPORT_SYMBOL_GPL(qcom_wcnss_assign_iris);

static int wcnss_load(struct rproc *rproc, const struct firmware *fw)
{
Expand Down Expand Up @@ -647,6 +646,28 @@ static struct platform_driver wcnss_driver = {
},
};

module_platform_driver(wcnss_driver);
static int __init wcnss_init(void)
{
int ret;

ret = platform_driver_register(&wcnss_driver);
if (ret)
return ret;

ret = platform_driver_register(&qcom_iris_driver);
if (ret)
platform_driver_unregister(&wcnss_driver);

return ret;
}
module_init(wcnss_init);

static void __exit wcnss_exit(void)
{
platform_driver_unregister(&qcom_iris_driver);
platform_driver_unregister(&wcnss_driver);
}
module_exit(wcnss_exit);

MODULE_DESCRIPTION("Qualcomm Peripherial Image Loader for Wireless Subsystem");
MODULE_LICENSE("GPL v2");
2 changes: 2 additions & 0 deletions drivers/remoteproc/qcom_wcnss.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
struct qcom_iris;
struct qcom_wcnss;

extern struct platform_driver qcom_iris_driver;

struct wcnss_vreg_info {
const char * const name;
int min_voltage;
Expand Down
8 changes: 1 addition & 7 deletions drivers/remoteproc/qcom_wcnss_iris.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,14 +94,12 @@ int qcom_iris_enable(struct qcom_iris *iris)

return ret;
}
EXPORT_SYMBOL_GPL(qcom_iris_enable);

void qcom_iris_disable(struct qcom_iris *iris)
{
clk_disable_unprepare(iris->xo_clk);
regulator_bulk_disable(iris->num_vregs, iris->vregs);
}
EXPORT_SYMBOL_GPL(qcom_iris_disable);

static int qcom_iris_probe(struct platform_device *pdev)
{
Expand Down Expand Up @@ -175,15 +173,11 @@ static const struct of_device_id iris_of_match[] = {
};
MODULE_DEVICE_TABLE(of, iris_of_match);

static struct platform_driver wcnss_driver = {
struct platform_driver qcom_iris_driver = {
.probe = qcom_iris_probe,
.remove = qcom_iris_remove,
.driver = {
.name = "qcom-iris",
.of_match_table = iris_of_match,
},
};

module_platform_driver(wcnss_driver);
MODULE_DESCRIPTION("Qualcomm Wireless Subsystem Iris driver");
MODULE_LICENSE("GPL v2");

0 comments on commit 6de1a50

Please sign in to comment.