[PATCH 15/39] drm/imx: dc: fu: Pass struct dc_fu_subdev_match_data via OF match data
Marek Vasut
marek.vasut at mailbox.org
Sat Oct 11 09:51:30 PDT 2025
Introduce struct dc_fu_subdev_match_data which describes the differences
between i.MX8QXP and i.MX95, which in this case register offsets as well
as address space offsets, and pass it as OF match data into the driver, so
the driver can use the match data to correctly access registers on each SoC.
This is a preparatory patch for i.MX95 addition. No functional change.
Signed-off-by: Marek Vasut <marek.vasut at mailbox.org>
---
Cc: Abel Vesa <abelvesa at kernel.org>
Cc: Conor Dooley <conor+dt at kernel.org>
Cc: Fabio Estevam <festevam at gmail.com>
Cc: Krzysztof Kozlowski <krzk+dt at kernel.org>
Cc: Laurent Pinchart <Laurent.pinchart at ideasonboard.com>
Cc: Liu Ying <victor.liu at nxp.com>
Cc: Lucas Stach <l.stach at pengutronix.de>
Cc: Peng Fan <peng.fan at nxp.com>
Cc: Pengutronix Kernel Team <kernel at pengutronix.de>
Cc: Rob Herring <robh at kernel.org>
Cc: Shawn Guo <shawnguo at kernel.org>
Cc: Thomas Zimmermann <tzimmermann at suse.de>
Cc: devicetree at vger.kernel.org
Cc: dri-devel at lists.freedesktop.org
Cc: imx at lists.linux.dev
Cc: linux-arm-kernel at lists.infradead.org
Cc: linux-clk at vger.kernel.org
---
drivers/gpu/drm/imx/dc/dc-fl.c | 61 +++++++++++++++++++++++-----------
1 file changed, 41 insertions(+), 20 deletions(-)
diff --git a/drivers/gpu/drm/imx/dc/dc-fl.c b/drivers/gpu/drm/imx/dc/dc-fl.c
index a76825dc75fe1..53647e3a395b4 100644
--- a/drivers/gpu/drm/imx/dc/dc-fl.c
+++ b/drivers/gpu/drm/imx/dc/dc-fl.c
@@ -15,8 +15,6 @@
#include "dc-drv.h"
#include "dc-fu.h"
-#define FRAC_OFFSET 0x28
-
#define BURSTBUFFERMANAGEMENT 0xc
#define BASEADDRESS 0x10
#define SOURCEBUFFERATTRIBUTES 0x14
@@ -28,35 +26,55 @@
#define CLIPWINDOWDIMENSIONS 0x2c
#define CONSTANTCOLOR 0x30
#define LAYERPROPERTY 0x34
-#define FRAMEDIMENSIONS 0x150
+#define FRAMEDIMENSIONS_IMX8QXP 0x150
struct dc_fl {
struct dc_fu fu;
};
-static const struct dc_subdev_info dc_fl_info[] = {
+struct dc_fl_subdev_match_data {
+ const struct regmap_config *regmap_config;
+ unsigned int reg_offset_bbm;
+ unsigned int reg_offset_base;
+ unsigned int reg_offset_rest;
+ unsigned int reg_framedimensions;
+ unsigned int reg_frac_offset;
+ const struct dc_subdev_info *info;
+};
+
+static const struct dc_subdev_info dc_fl_info_imx8qxp[] = {
{ .reg_start = 0x56180ac0, .id = 0, },
{ /* sentinel */ },
};
-static const struct regmap_range dc_fl_regmap_ranges[] = {
- regmap_reg_range(STATICCONTROL, FRAMEDIMENSIONS),
+static const struct regmap_range dc_fl_regmap_ranges_imx8qxp[] = {
+ regmap_reg_range(STATICCONTROL, FRAMEDIMENSIONS_IMX8QXP),
};
-static const struct regmap_access_table dc_fl_regmap_access_table = {
- .yes_ranges = dc_fl_regmap_ranges,
- .n_yes_ranges = ARRAY_SIZE(dc_fl_regmap_ranges),
+static const struct regmap_access_table dc_fl_regmap_access_table_imx8qxp = {
+ .yes_ranges = dc_fl_regmap_ranges_imx8qxp,
+ .n_yes_ranges = ARRAY_SIZE(dc_fl_regmap_ranges_imx8qxp),
};
-static const struct regmap_config dc_fl_cfg_regmap_config = {
+static const struct regmap_config dc_fl_cfg_regmap_config_imx8qxp = {
.name = "cfg",
.reg_bits = 32,
.reg_stride = 4,
.val_bits = 32,
.fast_io = true,
- .wr_table = &dc_fl_regmap_access_table,
- .rd_table = &dc_fl_regmap_access_table,
- .max_register = FRAMEDIMENSIONS,
+ .wr_table = &dc_fl_regmap_access_table_imx8qxp,
+ .rd_table = &dc_fl_regmap_access_table_imx8qxp,
+ .max_register = FRAMEDIMENSIONS_IMX8QXP,
+};
+
+static const struct dc_fl_subdev_match_data dc_fl_match_data_imx8qxp = {
+ .regmap_config = &dc_fl_cfg_regmap_config_imx8qxp,
+ .reg_offset_bbm = 0,
+ .reg_offset_base = 0,
+ .reg_offset_rest = 0,
+ .reg_framedimensions = FRAMEDIMENSIONS_IMX8QXP,
+ .reg_frac_offset = 0x28,
+ .info = dc_fl_info_imx8qxp,
};
static void dc_fl_set_fmt(struct dc_fu *fu, enum dc_fu_frac frac,
@@ -99,9 +117,11 @@ static void dc_fl_set_ops(struct dc_fu *fu)
static int dc_fl_bind(struct device *dev, struct device *master, void *data)
{
+ const struct dc_fl_subdev_match_data *dc_fl_match_data = device_get_match_data(dev);
+ const struct dc_subdev_info *dc_fl_info = dc_fl_match_data->info;
struct platform_device *pdev = to_platform_device(dev);
struct dc_drm_device *dc_drm = data;
- unsigned int off_base, off_regs;
+ unsigned int off, off_base, off_regs;
struct resource *res_pec;
void __iomem *base_cfg;
struct dc_fl *fl;
@@ -121,7 +141,7 @@ static int dc_fl_bind(struct device *dev, struct device *master, void *data)
return PTR_ERR(base_cfg);
fu->reg_cfg = devm_regmap_init_mmio(dev, base_cfg,
- &dc_fl_cfg_regmap_config);
+ dc_fl_match_data->regmap_config);
if (IS_ERR(fu->reg_cfg))
return PTR_ERR(fu->reg_cfg);
@@ -134,9 +154,10 @@ static int dc_fl_bind(struct device *dev, struct device *master, void *data)
fu->link_id = LINK_ID_FETCHLAYER0;
fu->id = DC_FETCHUNIT_FL0;
for (i = 0; i < DC_FETCHUNIT_FRAC_NUM; i++) {
- off_base = i * FRAC_OFFSET;
+ off = i * dc_fl_match_data->reg_frac_offset;
+ off_base = off + dc_fl_match_data->reg_offset_base;
fu->reg_baseaddr[i] = BASEADDRESS + off_base;
- off_regs = i * FRAC_OFFSET;
+ off_regs = off + dc_fl_match_data->reg_offset_rest;
fu->reg_sourcebufferattributes[i] = SOURCEBUFFERATTRIBUTES + off_regs;
fu->reg_sourcebufferdimension[i] = SOURCEBUFFERDIMENSION + off_regs;
fu->reg_colorcomponentbits[i] = COLORCOMPONENTBITS + off_regs;
@@ -147,8 +168,8 @@ static int dc_fl_bind(struct device *dev, struct device *master, void *data)
fu->reg_constantcolor[i] = CONSTANTCOLOR + off_regs;
fu->reg_layerproperty[i] = LAYERPROPERTY + off_regs;
}
- fu->reg_burstbuffermanagement = BURSTBUFFERMANAGEMENT;
- fu->reg_framedimensions = FRAMEDIMENSIONS;
+ fu->reg_burstbuffermanagement = BURSTBUFFERMANAGEMENT + dc_fl_match_data->reg_offset_bbm;
+ fu->reg_framedimensions = dc_fl_match_data->reg_framedimensions;
snprintf(fu->name, sizeof(fu->name), "FetchLayer%d", id);
dc_fl_set_ops(fu);
@@ -180,7 +201,7 @@ static void dc_fl_remove(struct platform_device *pdev)
}
static const struct of_device_id dc_fl_dt_ids[] = {
- { .compatible = "fsl,imx8qxp-dc-fetchlayer" },
+ { .compatible = "fsl,imx8qxp-dc-fetchlayer", .data = &dc_fl_match_data_imx8qxp },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, dc_fl_dt_ids);
--
2.51.0
More information about the linux-arm-kernel
mailing list