[PATCH RESEND] mfd: Add Freescale i.MX8qxp Control and Status Registers (CSR) module driver

From: Liu Ying
Date: Mon Oct 17 2022 - 03:55:58 EST


Freescale i.MX8qxp Control and Status Registers (CSR) module is a system
controller. It represents a set of miscellaneous registers of a specific
subsystem. It may provide control and/or status report interfaces to a
mix of standalone hardware devices within that subsystem.

The CSR module in i.MX8qm/qxp SoCs is a child node of a simple power-managed
bus(i.MX8qxp pixel link MSI bus). To propagate power management operations
of the CSR module's child devices to that simple power-managed bus, add a
dedicated driver for the CSR module. Also, the driver would populate the CSR
module's child devices.

Signed-off-by: Liu Ying <victor.liu@xxxxxxx>
---
The Freescale i.MX8qxp CSR DT bindings is at
Documentation/devicetree/bindings/mfd/fsl,imx8qxp-csr.yaml.

Resend the patch based on v6.1-rc1.

drivers/mfd/Kconfig | 10 +++++++
drivers/mfd/Makefile | 1 +
drivers/mfd/fsl-imx8qxp-csr.c | 53 +++++++++++++++++++++++++++++++++++
3 files changed, 64 insertions(+)
create mode 100644 drivers/mfd/fsl-imx8qxp-csr.c

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 8b93856de432..966a250d7910 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -499,6 +499,16 @@ config MFD_MX25_TSADC
i.MX25 processors. They consist of a conversion queue for general
purpose ADC and a queue for Touchscreens.

+config MFD_MX8QXP_CSR
+ tristate "Freescale i.MX8qxp Control and Status Registers (CSR) Module"
+ depends on (ARCH_MXC && OF) || COMPILE_TEST
+ help
+ Enable support for Freescale i.MX8qm/qxp Control and Status Registers
+ (CSR) Module. As a system controller, CSR represents a set of
+ miscellaneous registers of a specific subsystem. It may provide
+ control and/or status report interfaces to a mix of standalone
+ hardware devices within that subsystem.
+
config MFD_HI6421_PMIC
tristate "HiSilicon Hi6421 PMU/Codec IC"
depends on OF
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 7ed3ef4a698c..5c3c13d7ce85 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -113,6 +113,7 @@ obj-$(CONFIG_MFD_TWL4030_AUDIO) += twl4030-audio.o
obj-$(CONFIG_TWL6040_CORE) += twl6040.o

obj-$(CONFIG_MFD_MX25_TSADC) += fsl-imx25-tsadc.o
+obj-$(CONFIG_MFD_MX8QXP_CSR) += fsl-imx8qxp-csr.o

obj-$(CONFIG_MFD_MC13XXX) += mc13xxx-core.o
obj-$(CONFIG_MFD_MC13XXX_SPI) += mc13xxx-spi.o
diff --git a/drivers/mfd/fsl-imx8qxp-csr.c b/drivers/mfd/fsl-imx8qxp-csr.c
new file mode 100644
index 000000000000..3915d3d6ca65
--- /dev/null
+++ b/drivers/mfd/fsl-imx8qxp-csr.c
@@ -0,0 +1,53 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/*
+ * Copyright 2022 NXP
+ */
+
+#include <linux/module.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+
+static int imx8qxp_csr_probe(struct platform_device *pdev)
+{
+ int ret;
+
+ pm_runtime_enable(&pdev->dev);
+
+ ret = devm_of_platform_populate(&pdev->dev);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "failed to populate sub-devices: %d\n", ret);
+ pm_runtime_disable(&pdev->dev);
+ }
+
+ return ret;
+}
+
+static int imx8qxp_csr_remove(struct platform_device *pdev)
+{
+ pm_runtime_disable(&pdev->dev);
+ return 0;
+}
+
+static const struct of_device_id imx8qxp_csr_of_match[] = {
+ { .compatible = "fsl,imx8qxp-mipi-lvds-csr", },
+ { .compatible = "fsl,imx8qm-lvds-csr", },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, imx8qxp_csr_of_match);
+
+static struct platform_driver imx8qxp_csr_driver = {
+ .probe = imx8qxp_csr_probe,
+ .remove = imx8qxp_csr_remove,
+ .driver = {
+ .name = "imx8qxp-csr",
+ .of_match_table = imx8qxp_csr_of_match,
+ },
+};
+
+module_platform_driver(imx8qxp_csr_driver);
+
+MODULE_DESCRIPTION("Freescale i.MX8qm/qxp Control and Status Registers Module Driver");
+MODULE_AUTHOR("Liu Ying <victor.liu@xxxxxxx>");
+MODULE_LICENSE("GPL v2");
--
2.37.1