aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/devfreq
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/devfreq')
-rw-r--r--drivers/devfreq/imx-bus.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/drivers/devfreq/imx-bus.c b/drivers/devfreq/imx-bus.c
index 428f7980a2f2..532e7954032f 100644
--- a/drivers/devfreq/imx-bus.c
+++ b/drivers/devfreq/imx-bus.c
@@ -16,6 +16,7 @@ struct imx_bus {
struct devfreq_dev_profile profile;
struct devfreq *devfreq;
struct clk *clk;
+ struct platform_device *icc_pdev;
};
static int imx_bus_target(struct device *dev,
@@ -58,7 +59,40 @@ static int imx_bus_get_dev_status(struct device *dev,
static void imx_bus_exit(struct device *dev)
{
+ struct imx_bus *priv = dev_get_drvdata(dev);
+
dev_pm_opp_of_remove_table(dev);
+ platform_device_unregister(priv->icc_pdev);
+}
+
+/* imx_bus_init_icc() - register matching icc provider if required */
+static int imx_bus_init_icc(struct device *dev)
+{
+ struct imx_bus *priv = dev_get_drvdata(dev);
+ const char *icc_driver_name;
+
+ if (!of_get_property(dev->of_node, "#interconnect-cells", 0))
+ return 0;
+ if (!IS_ENABLED(CONFIG_INTERCONNECT_IMX)) {
+ dev_warn(dev, "imx interconnect drivers disabled\n");
+ return 0;
+ }
+
+ icc_driver_name = of_device_get_match_data(dev);
+ if (!icc_driver_name) {
+ dev_err(dev, "unknown interconnect driver\n");
+ return 0;
+ }
+
+ priv->icc_pdev = platform_device_register_data(
+ dev, icc_driver_name, -1, NULL, 0);
+ if (IS_ERR(priv->icc_pdev)) {
+ dev_err(dev, "failed to register icc provider %s: %ld\n",
+ icc_driver_name, PTR_ERR(priv->devfreq));
+ return PTR_ERR(priv->devfreq);
+ }
+
+ return 0;
}
static int imx_bus_probe(struct platform_device *pdev)
@@ -110,6 +144,10 @@ static int imx_bus_probe(struct platform_device *pdev)
goto err;
}
+ ret = imx_bus_init_icc(dev);
+ if (ret)
+ goto err;
+
return 0;
err:
@@ -118,6 +156,9 @@ err:
}
static const struct of_device_id imx_bus_of_match[] = {
+ { .compatible = "fsl,imx8mq-noc", .data = "imx8mq-interconnect", },
+ { .compatible = "fsl,imx8mm-noc", .data = "imx8mm-interconnect", },
+ { .compatible = "fsl,imx8mn-noc", .data = "imx8mn-interconnect", },
{ .compatible = "fsl,imx8m-noc", },
{ .compatible = "fsl,imx8m-nic", },
{ /* sentinel */ },