remoteproc: qcom_wcnss: Fix circular module dependency
authorBjorn Andersson <bjorn.andersson@linaro.org>
Fri, 4 Nov 2016 02:37:25 +0000 (19:37 -0700)
committerBjorn Andersson <bjorn.andersson@linaro.org>
Tue, 15 Nov 2016 05:52:19 +0000 (21:52 -0800)
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: aed361adca9f ("remoteproc: qcom: Introduce WCNSS peripheral image loader")
Reported-by: Andreas Färber <afaerber@suse.de>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
drivers/remoteproc/Kconfig
drivers/remoteproc/Makefile
drivers/remoteproc/qcom_wcnss.c
drivers/remoteproc/qcom_wcnss.h
drivers/remoteproc/qcom_wcnss_iris.c

index f396bfef5d42863b4f3b9609c9798b4df4ce6059..5fcbefcb86369b1de1ff95f8819b9e542c8f866e 100644 (file)
@@ -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
index 6da9b12f9798556958fa4a744e395512a31d4e63..d79eeeae6366e61443fc97341e8d39b53b1e3439 100644 (file)
@@ -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
index 81fe891ef526ce9725317044d3fadd5bd43638b1..ebd61f5d18bb05562f8a3a687c83d5024a8e13b3 100644 (file)
@@ -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)
 {
@@ -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");
index 9dc4a9fe41e19af6e637285b5bbce1664ac78b8d..25fb7f62a4576ddda9cea53247246ae26c84b9de 100644 (file)
@@ -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;
index 07ef653cfbdf3e92faab50c6eb408a0871622b85..e842be58e8c7799a59b4d36b3f186f0c8631a664 100644 (file)
@@ -94,14 +94,12 @@ disable_regulators:
 
        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)
 {
@@ -175,7 +173,7 @@ 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 = {
@@ -183,7 +181,3 @@ static struct platform_driver wcnss_driver = {
                .of_match_table = iris_of_match,
        },
 };
-
-module_platform_driver(wcnss_driver);
-MODULE_DESCRIPTION("Qualcomm Wireless Subsystem Iris driver");
-MODULE_LICENSE("GPL v2");