From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 35F97CCD184 for ; Sat, 11 Oct 2025 17:03:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=ErK6e9i/wjS7D9cMMdBt0NCt0j83MkMrjGYuP5XcID0=; b=1JdGJIWZv36zfS0PvyIfmjG8h9 ZBXWOyn0Qs4aXLZUaWKjdym7ivpfI2AiGZ+phbIyFwsWTT6lb2niyUnkFjq8nnrNGsXaDTx/AkIKQ CxLobpPm07zoACM3SdfZ8Seo+scNXWVJEATmZAq3SlVtw+QX/qqN4RQTBL8KJ121aXuE3bNLecR60 nNCOqJiRpkUgiKLrfLD5kTLhyMZUhvgce8ZCm8ElM8/g4tcs8ZF+q9FkVm7yw/Fqhj1pXAxrjyHNQ JeoLJr2N/vLEALKKmZ8dMyw9gHUYKMztPXBfv8fZ4alYde3RmGoB2FluBcPj7J8O5CtFB6PUp14BV 5I08QeGg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1v7d0H-0000000ANI8-1z2b; Sat, 11 Oct 2025 17:03:33 +0000 Received: from mout-p-103.mailbox.org ([80.241.56.161]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1v7d0D-0000000ANA7-06sE for linux-arm-kernel@lists.infradead.org; Sat, 11 Oct 2025 17:03:30 +0000 Received: from smtp102.mailbox.org (smtp102.mailbox.org [IPv6:2001:67c:2050:b231:465::102]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-103.mailbox.org (Postfix) with ESMTPS id 4ckVLR29Bpz9spd; Sat, 11 Oct 2025 19:03:27 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailbox.org; s=mail20150812; t=1760202207; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ErK6e9i/wjS7D9cMMdBt0NCt0j83MkMrjGYuP5XcID0=; b=D9GcZ8AmG6AaoIZj+ceFkBpWEV5qgsuYHj5s6pbmYGi2wrzioPz0ybULF2sPVhfUJFDmbA G96veOOJNUbb+hncWaEBiOodi8d0oiUnDfwid/P9f/TNVG5lvnfK2B0w5+zocKazi7DL8m UUoTUiV8Sxei9bt1tZ+vgWc0X40Allt2DiytVbtXoJ+eWP9DfFKX+Lqp0/PzXxZ/7ME6wm fAEIT0qREgTYwc4g1lQQ3qrwcszsQWjOFc9cEikNzI3zoZ3FYc9Z6mZtkEWMPwVDokbICr 6+waA8gcHPVS3CpNxIECG3iOjZcyRZ3IPo2OtA/gRj/k1MwuZnYKWdRVuHFbIQ== Authentication-Results: outgoing_mbo_mout; dkim=pass header.d=mailbox.org header.s=mail20150812 header.b=lbh+dnf1; spf=pass (outgoing_mbo_mout: domain of marek.vasut@mailbox.org designates 2001:67c:2050:b231:465::102 as permitted sender) smtp.mailfrom=marek.vasut@mailbox.org From: Marek Vasut DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailbox.org; s=mail20150812; t=1760202205; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ErK6e9i/wjS7D9cMMdBt0NCt0j83MkMrjGYuP5XcID0=; b=lbh+dnf1T9rBBuA4bHYXlRFBd0VztWtZjlMnkmWfCrHKYuUfdm2/z6D4wcnnYjdNuBEBWV Dvc7e4taqQI28ga2ZEELRkIH3QgSJnHbYgXxlPspk9EnGSb3ODznhXWdc5ofsNZb/CrKlt fnD+5IaZ27AF0wk/deZhLDthDiX8N+Z90872nvTbIgOXXTxHe3iCxu+7ELAXLVKM2a8KXq vpc26uyYWmcoKZRosDUOZnAMnQBDWWhC6kQmLMwPFpjtlz1QA5pcvCqJQbAchNBt5nVc15 qTSr1CiCrgWK4cd4WX5JneVKd1EenTk2M/FlFtnNE/nkW2nvc4QaPJN45EDY8A== To: dri-devel@lists.freedesktop.org Cc: Marek Vasut , Abel Vesa , Conor Dooley , Fabio Estevam , Krzysztof Kozlowski , Laurent Pinchart , Liu Ying , Lucas Stach , Peng Fan , Pengutronix Kernel Team , Rob Herring , Shawn Guo , Thomas Zimmermann , devicetree@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org Subject: [PATCH 12/39] drm/imx: dc: ed: Pass struct dc_fg_subdev_match_data via OF match data Date: Sat, 11 Oct 2025 18:51:27 +0200 Message-ID: <20251011170213.128907-13-marek.vasut@mailbox.org> In-Reply-To: <20251011170213.128907-1-marek.vasut@mailbox.org> References: <20251011170213.128907-1-marek.vasut@mailbox.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-MBO-RS-META: kmprimnucqnf3djqono8dz78r7jet6sw X-MBO-RS-ID: 1ce2888521c792f702c X-Rspamd-Queue-Id: 4ckVLR29Bpz9spd X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20251011_100329_242420_5A00B7AA X-CRM114-Status: GOOD ( 19.32 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Introduce struct dc_fg_subdev_match_data which describes the differences between i.MX8QXP and i.MX95, which in this case is registers offset and address space offsets, and pass it as OF match data into the driver, so the driver can use the match data to apply correct offset to access the IP registers on each SoC. This is a preparatory patch for i.MX95 addition. No functional change. Signed-off-by: Marek Vasut --- Cc: Abel Vesa Cc: Conor Dooley Cc: Fabio Estevam Cc: Krzysztof Kozlowski Cc: Laurent Pinchart Cc: Liu Ying Cc: Lucas Stach Cc: Peng Fan Cc: Pengutronix Kernel Team Cc: Rob Herring Cc: Shawn Guo Cc: Thomas Zimmermann Cc: devicetree@vger.kernel.org Cc: dri-devel@lists.freedesktop.org Cc: imx@lists.linux.dev Cc: linux-arm-kernel@lists.infradead.org Cc: linux-clk@vger.kernel.org --- drivers/gpu/drm/imx/dc/dc-de.h | 1 + drivers/gpu/drm/imx/dc/dc-fg.c | 74 +++++++++++++++++++++------------- 2 files changed, 46 insertions(+), 29 deletions(-) diff --git a/drivers/gpu/drm/imx/dc/dc-de.h b/drivers/gpu/drm/imx/dc/dc-de.h index e054ad88190e1..797056a09ddb4 100644 --- a/drivers/gpu/drm/imx/dc/dc-de.h +++ b/drivers/gpu/drm/imx/dc/dc-de.h @@ -26,6 +26,7 @@ struct dc_fg { struct device *dev; struct regmap *reg; struct clk *clk_disp; + unsigned int reg_offset; }; struct dc_tc { diff --git a/drivers/gpu/drm/imx/dc/dc-fg.c b/drivers/gpu/drm/imx/dc/dc-fg.c index 05e635fdb4f9c..e13b057a92ffb 100644 --- a/drivers/gpu/drm/imx/dc/dc-fg.c +++ b/drivers/gpu/drm/imx/dc/dc-fg.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -82,6 +83,12 @@ #define FGCHSTATCLR(o) (0x7c + (o)) #define CLRSECSTAT BIT(16) +struct dc_fg_subdev_match_data { + const struct regmap_config *regmap_config; + unsigned int reg_offset; + const struct dc_subdev_info *info; +}; + enum dc_fg_syncmode { FG_SYNCMODE_OFF, /* No side-by-side synchronization. */ }; @@ -91,46 +98,52 @@ enum dc_fg_dm { FG_DM_SEC_ON_TOP = 0x5, /* Both inputs overlaid with secondary on top. */ }; -static const struct dc_subdev_info dc_fg_info[] = { +static const struct dc_subdev_info dc_fg_info_imx8qxp[] = { { .reg_start = 0x5618b800, .id = 0, }, { .reg_start = 0x5618d400, .id = 1, }, { /* sentinel */ }, }; -static const struct regmap_range dc_fg_regmap_write_ranges[] = { +static const struct regmap_range dc_fg_regmap_write_ranges_imx8qxp[] = { regmap_reg_range(FGSTCTRL, VTCFG2), regmap_reg_range(PKICKCONFIG, SKICKCONFIG), regmap_reg_range(PACFG(OFFSET_MX8QXP), FGSLR(OFFSET_MX8QXP)), regmap_reg_range(FGCHSTATCLR(OFFSET_MX8QXP), FGCHSTATCLR(OFFSET_MX8QXP)), }; -static const struct regmap_range dc_fg_regmap_read_ranges[] = { +static const struct regmap_range dc_fg_regmap_read_ranges_imx8qxp[] = { regmap_reg_range(FGSTCTRL, VTCFG2), regmap_reg_range(PKICKCONFIG, SKICKCONFIG), regmap_reg_range(PACFG(OFFSET_MX8QXP), FGENABLE(OFFSET_MX8QXP)), regmap_reg_range(FGTIMESTAMP(OFFSET_MX8QXP), FGCHSTAT(OFFSET_MX8QXP)), }; -static const struct regmap_access_table dc_fg_regmap_write_table = { - .yes_ranges = dc_fg_regmap_write_ranges, - .n_yes_ranges = ARRAY_SIZE(dc_fg_regmap_write_ranges), +static const struct regmap_access_table dc_fg_regmap_write_table_imx8qxp = { + .yes_ranges = dc_fg_regmap_write_ranges_imx8qxp, + .n_yes_ranges = ARRAY_SIZE(dc_fg_regmap_write_ranges_imx8qxp), }; -static const struct regmap_access_table dc_fg_regmap_read_table = { - .yes_ranges = dc_fg_regmap_read_ranges, - .n_yes_ranges = ARRAY_SIZE(dc_fg_regmap_read_ranges), +static const struct regmap_access_table dc_fg_regmap_read_table_imx8qxp = { + .yes_ranges = dc_fg_regmap_read_ranges_imx8qxp, + .n_yes_ranges = ARRAY_SIZE(dc_fg_regmap_read_ranges_imx8qxp), }; -static const struct regmap_config dc_fg_regmap_config = { +static const struct regmap_config dc_fg_regmap_config_imx8qxp = { .reg_bits = 32, .reg_stride = 4, .val_bits = 32, .fast_io = true, - .wr_table = &dc_fg_regmap_write_table, - .rd_table = &dc_fg_regmap_read_table, + .wr_table = &dc_fg_regmap_write_table_imx8qxp, + .rd_table = &dc_fg_regmap_read_table_imx8qxp, .max_register = FGCHSTATCLR(OFFSET_MX8QXP), }; +static const struct dc_fg_subdev_match_data dc_fg_match_data_imx8qxp = { + .regmap_config = &dc_fg_regmap_config_imx8qxp, + .reg_offset = OFFSET_MX8QXP, + .info = dc_fg_info_imx8qxp, +}; + static inline void dc_fg_enable_shden(struct dc_fg *fg) { regmap_write_bits(fg->reg, FGSTCTRL, SHDEN, SHDEN); @@ -174,15 +187,15 @@ void dc_fg_cfg_videomode(struct dc_fg *fg, struct drm_display_mode *m) regmap_write(fg->reg, SKICKCONFIG, COL(kick_col) | ROW(kick_row) | EN); /* primary and secondary area position configuration */ - regmap_write(fg->reg, PACFG(OFFSET_MX8QXP), STARTX(0) | STARTY(0)); - regmap_write(fg->reg, SACFG(OFFSET_MX8QXP), STARTX(0) | STARTY(0)); + regmap_write(fg->reg, PACFG(fg->reg_offset), STARTX(0) | STARTY(0)); + regmap_write(fg->reg, SACFG(fg->reg_offset), STARTX(0) | STARTY(0)); /* alpha */ - regmap_write_bits(fg->reg, FGINCTRL(OFFSET_MX8QXP), ENPRIMALPHA | ENSECALPHA, 0); - regmap_write_bits(fg->reg, FGINCTRLPANIC(OFFSET_MX8QXP), ENPRIMALPHA | ENSECALPHA, 0); + regmap_write_bits(fg->reg, FGINCTRL(fg->reg_offset), ENPRIMALPHA | ENSECALPHA, 0); + regmap_write_bits(fg->reg, FGINCTRLPANIC(fg->reg_offset), ENPRIMALPHA | ENSECALPHA, 0); /* constant color is green(used in panic mode) */ - regmap_write(fg->reg, FGCCR(OFFSET_MX8QXP), CCGREEN(0x3ff)); + regmap_write(fg->reg, FGCCR(fg->reg_offset), CCGREEN(0x3ff)); ret = clk_set_rate(fg->clk_disp, m->clock * HZ_PER_KHZ); if (ret < 0) @@ -191,34 +204,34 @@ void dc_fg_cfg_videomode(struct dc_fg *fg, struct drm_display_mode *m) static inline void dc_fg_displaymode(struct dc_fg *fg, enum dc_fg_dm mode) { - regmap_write_bits(fg->reg, FGINCTRL(OFFSET_MX8QXP), FGDM_MASK, mode); + regmap_write_bits(fg->reg, FGINCTRL(fg->reg_offset), FGDM_MASK, mode); } static inline void dc_fg_panic_displaymode(struct dc_fg *fg, enum dc_fg_dm mode) { - regmap_write_bits(fg->reg, FGINCTRLPANIC(OFFSET_MX8QXP), FGDM_MASK, mode); + regmap_write_bits(fg->reg, FGINCTRLPANIC(fg->reg_offset), FGDM_MASK, mode); } void dc_fg_enable(struct dc_fg *fg) { - regmap_write(fg->reg, FGENABLE(OFFSET_MX8QXP), FGEN); + regmap_write(fg->reg, FGENABLE(fg->reg_offset), FGEN); } void dc_fg_disable(struct dc_fg *fg) { - regmap_write(fg->reg, FGENABLE(OFFSET_MX8QXP), 0); + regmap_write(fg->reg, FGENABLE(fg->reg_offset), 0); } void dc_fg_shdtokgen(struct dc_fg *fg) { - regmap_write(fg->reg, FGSLR(OFFSET_MX8QXP), SHDTOKGEN); + regmap_write(fg->reg, FGSLR(fg->reg_offset), SHDTOKGEN); } u32 dc_fg_get_frame_index(struct dc_fg *fg) { u32 val; - regmap_read(fg->reg, FGTIMESTAMP(OFFSET_MX8QXP), &val); + regmap_read(fg->reg, FGTIMESTAMP(fg->reg_offset), &val); return FRAMEINDEX(val); } @@ -227,7 +240,7 @@ u32 dc_fg_get_line_index(struct dc_fg *fg) { u32 val; - regmap_read(fg->reg, FGTIMESTAMP(OFFSET_MX8QXP), &val); + regmap_read(fg->reg, FGTIMESTAMP(fg->reg_offset), &val); return LINEINDEX(val); } @@ -251,21 +264,21 @@ bool dc_fg_secondary_requests_to_read_empty_fifo(struct dc_fg *fg) { u32 val; - regmap_read(fg->reg, FGCHSTAT(OFFSET_MX8QXP), &val); + regmap_read(fg->reg, FGCHSTAT(fg->reg_offset), &val); return !!(val & SFIFOEMPTY); } void dc_fg_secondary_clear_channel_status(struct dc_fg *fg) { - regmap_write(fg->reg, FGCHSTATCLR(OFFSET_MX8QXP), CLRSECSTAT); + regmap_write(fg->reg, FGCHSTATCLR(fg->reg_offset), CLRSECSTAT); } int dc_fg_wait_for_secondary_syncup(struct dc_fg *fg) { unsigned int val; - return regmap_read_poll_timeout(fg->reg, FGCHSTAT(OFFSET_MX8QXP), val, + return regmap_read_poll_timeout(fg->reg, FGCHSTAT(fg->reg_offset), val, val & SECSYNCSTAT, 5, 100000); } @@ -305,6 +318,8 @@ void dc_fg_init(struct dc_fg *fg) static int dc_fg_bind(struct device *dev, struct device *master, void *data) { + const struct dc_fg_subdev_match_data *dc_fg_match_data = device_get_match_data(dev); + const struct dc_subdev_info *dc_fg_info = dc_fg_match_data->info; struct platform_device *pdev = to_platform_device(dev); struct dc_drm_device *dc_drm = data; struct resource *res; @@ -320,7 +335,7 @@ static int dc_fg_bind(struct device *dev, struct device *master, void *data) if (IS_ERR(base)) return PTR_ERR(base); - fg->reg = devm_regmap_init_mmio(dev, base, &dc_fg_regmap_config); + fg->reg = devm_regmap_init_mmio(dev, base, dc_fg_match_data->regmap_config); if (IS_ERR(fg->reg)) return PTR_ERR(fg->reg); @@ -336,6 +351,7 @@ static int dc_fg_bind(struct device *dev, struct device *master, void *data) } fg->dev = dev; + fg->reg_offset = dc_fg_match_data->reg_offset; dc_drm->fg[id] = fg; return 0; @@ -363,7 +379,7 @@ static void dc_fg_remove(struct platform_device *pdev) } static const struct of_device_id dc_fg_dt_ids[] = { - { .compatible = "fsl,imx8qxp-dc-framegen" }, + { .compatible = "fsl,imx8qxp-dc-framegen", .data = &dc_fg_match_data_imx8qxp }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, dc_fg_dt_ids); -- 2.51.0