[PATCH 5/5] clk: imx: Add blk-ctl driver for i.MX8MM

Marek Vasut marex at denx.de
Sat Oct 3 18:45:55 EDT 2020


The i.MX8MM platform also has a BLK_CTL, however it is not documented
in the documentation at all. Enable the generic blk_ctl driver so the
IP can be controlled the same way as on MX8MP, and add the clock and
reset entries for MX8MM.

Signed-off-by: Marek Vasut <marex at denx.de>
Cc: Abel Vesa <abel.vesa at nxp.com>
Cc: Dong Aisheng <aisheng.dong at nxp.com>
Cc: Fabio Estevam <festevam at gmail.com>
Cc: Guido Günther <agx at sigxcpu.org>
Cc: Lucas Stach <l.stach at pengutronix.de>
Cc: NXP Linux Team <linux-imx at nxp.com>
Cc: Shawn Guo <shawnguo at kernel.org>
---
 drivers/clk/imx/Makefile             |  2 +-
 drivers/clk/imx/clk-blk-ctl-imx8mm.c | 66 ++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+), 1 deletion(-)
 create mode 100644 drivers/clk/imx/clk-blk-ctl-imx8mm.c

diff --git a/drivers/clk/imx/Makefile b/drivers/clk/imx/Makefile
index 6e70e6821727..5e7cc7ec29b6 100644
--- a/drivers/clk/imx/Makefile
+++ b/drivers/clk/imx/Makefile
@@ -25,7 +25,7 @@ obj-$(CONFIG_MXC_CLK_SCU) += \
 	clk-scu.o \
 	clk-lpcg-scu.o
 
-obj-$(CONFIG_CLK_IMX8MM) += clk-imx8mm.o
+obj-$(CONFIG_CLK_IMX8MM) += clk-imx8mm.o clk-blk-ctl.o clk-blk-ctl-imx8mm.o
 obj-$(CONFIG_CLK_IMX8MN) += clk-imx8mn.o
 obj-$(CONFIG_CLK_IMX8MP) += clk-imx8mp.o clk-blk-ctl.o clk-blk-ctl-imx8mp.o
 obj-$(CONFIG_CLK_IMX8MQ) += clk-imx8mq.o
diff --git a/drivers/clk/imx/clk-blk-ctl-imx8mm.c b/drivers/clk/imx/clk-blk-ctl-imx8mm.c
new file mode 100644
index 000000000000..6a60747bfd07
--- /dev/null
+++ b/drivers/clk/imx/clk-blk-ctl-imx8mm.c
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 Marek Vasut <marex at denx.de>
+ */
+
+#include <dt-bindings/clock/imx8mm-clock.h>
+#include <dt-bindings/reset/imx8mm-reset.h>
+#include <linux/clk-provider.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/types.h>
+
+#include "clk.h"
+#include "clk-blk-ctl.h"
+
+#define IMX_MEDIA_BLK_CTL_SFT_RSTN		0x0
+#define IMX_MEDIA_BLK_CTL_CLK_EN		0x4
+#define IMX_MEDIA_BLK_CTL_MIPI_RST		0x8
+
+static struct imx_blk_ctl_hw imx8mm_dispmix_blk_ctl_hws[] = {
+	/* clocks */
+	IMX_BLK_CTL_CLK_GATE("lcdif_apb_clk", IMX8MM_CLK_MEDIA_BLK_CTL_LCDIF_APB, 0x4, 6, "disp_apb"),
+	IMX_BLK_CTL_CLK_GATE("lcdif_pixel_clk", IMX8MM_CLK_MEDIA_BLK_CTL_LCDIF_PIXEL, 0x4, 7, "lcdif_pixel"),
+	IMX_BLK_CTL_CLK_GATE("mipi_dsi_pclk", IMX8MM_CLK_MEDIA_BLK_CTL_MIPI_DSI_PCLK, 0x4, 8, "dsi_core"),
+	IMX_BLK_CTL_CLK_GATE("mipi_dsi_clkref", IMX8MM_CLK_MEDIA_BLK_CTL_MIPI_DSI_CLKREF, 0x4, 9, "dsi_phy_ref"),
+
+	/* resets */
+	IMX_BLK_CTL_RESET(IMX8MM_MEDIA_BLK_CTL_RESET_MIPI_DSI_I_PRESET, 0x0, 5),
+	IMX_BLK_CTL_RESET(IMX8MM_MEDIA_BLK_CTL_RESET_MIPI_M_RESET, 0x8, 17),
+};
+
+const struct imx_blk_ctl_dev_data imx8mm_dispmix_blk_ctl_dev_data __initconst = {
+	.hws = imx8mm_dispmix_blk_ctl_hws,
+	.hws_num = ARRAY_SIZE(imx8mm_dispmix_blk_ctl_hws),
+	.clocks_max = IMX8MM_CLK_MEDIA_BLK_CTL_END,
+	.resets_max = IMX8MM_MEDIA_BLK_CTL_RESET_NUM,
+	.pm_runtime_saved_regs_num = 3,
+	.pm_runtime_saved_regs = {
+		IMX_MEDIA_BLK_CTL_SFT_RSTN,
+		IMX_MEDIA_BLK_CTL_CLK_EN,
+		IMX_MEDIA_BLK_CTL_MIPI_RST,
+	},
+};
+
+static const struct of_device_id imx_blk_ctl_of_match[] = {
+	{
+		.compatible = "fsl,imx8mm-dispmix-blk-ctl",
+		.data = &imx8mm_dispmix_blk_ctl_dev_data
+	},
+	{ /* Sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, imx_blk_ctl_of_match);
+
+static struct platform_driver imx_blk_ctl_driver = {
+	.probe = imx_blk_ctl_probe,
+	.driver = {
+		.name = "imx-blk-ctl",
+		.of_match_table = of_match_ptr(imx_blk_ctl_of_match),
+		.pm = &imx_blk_ctl_pm_ops,
+	},
+};
+module_platform_driver(imx_blk_ctl_driver);
-- 
2.28.0




More information about the linux-arm-kernel mailing list