From nobody Mon Feb 9 20:59:20 2026 Received: from layka.disroot.org (layka.disroot.org [178.21.23.139]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3019529E107; Sun, 6 Jul 2025 18:26:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=178.21.23.139 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751826397; cv=none; b=VpNha+Qh5UnjP3yWvexHmmH502M7EtNotigPfyuKQbvOaThE/DzV6m+/tzoDaVQKyYe1G8ZpFJmqsHOW3H7ScM9x/JQ8vpKsZ4t8y7ykod8TnV1Foid+WQcsUS6CMGdSn6LAQ05Qj3xvopeuzumVNyCJTVKs+wzLh9IcnSYOf1c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751826397; c=relaxed/simple; bh=sezB2gCswpH+5X4wtjHO7EgIJxpR2I20H2UdxlxKbhw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=a3uHnQtZNb99pcdyyYGxUB996g3tLT0wCsTQBRCGQMrJ+vHbV19IFuGfzDfiVkDzld96lz1FlXOnwo5MIm2WOoXdKI3z21MXvZGq3y5iFLo+EZ4MceUZ6b2d5askYLbQ7IXAugbfv1uPfAHrjZje0NuRHXr+DegeoTPkN30R9tc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=disroot.org; spf=pass smtp.mailfrom=disroot.org; dkim=pass (2048-bit key) header.d=disroot.org header.i=@disroot.org header.b=JtSlV/sm; arc=none smtp.client-ip=178.21.23.139 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=disroot.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=disroot.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=disroot.org header.i=@disroot.org header.b="JtSlV/sm" Received: from mail01.disroot.lan (localhost [127.0.0.1]) by disroot.org (Postfix) with ESMTP id B3B6B20D0D; Sun, 6 Jul 2025 20:26:33 +0200 (CEST) X-Virus-Scanned: SPAM Filter at disroot.org Received: from layka.disroot.org ([127.0.0.1]) by localhost (disroot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id TDJ92r2bbDG9; Sun, 6 Jul 2025 20:26:31 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=disroot.org; s=mail; t=1751826391; bh=sezB2gCswpH+5X4wtjHO7EgIJxpR2I20H2UdxlxKbhw=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=JtSlV/smLZG2bl5+B7mmihBHGo3+fJ9roKgh7SAbzQg+sTIr2YJF6tsTg+wKIxKCQ LFxpjF/QmnhMX9RulB5av6iNruuGqHsWq2OqJXD/DorxmY5hdID7qQGC7ydWPSY7iX hv6ZHHJ3FXWNCi4mPv9x2rqI4xL566kxQYEgiKhfijwcfu2Q0NYkhtTiMIHHLM/xKZ yTJdcU1InI+wfvWlRTfoZii2pvhSlYmgysfdcrocoEQUc0JcJp1QVQ9BoJxk8LX7CS lbMldvVv4PYw7gDZVHZ36dj3r5kXHtWxovEAPaH+ERaohRJVcatNSq51+1F0gN68V/ rfuw8fEdMLYkw== From: Kaustabh Chakraborty Date: Sun, 06 Jul 2025 23:55:38 +0530 Subject: [PATCH v3 04/13] drm/bridge: samsung-dsim: allow configuring bits and offsets of CLKCTRL register Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250706-exynos7870-dsim-v3-4-9879fb9a644d@disroot.org> References: <20250706-exynos7870-dsim-v3-0-9879fb9a644d@disroot.org> In-Reply-To: <20250706-exynos7870-dsim-v3-0-9879fb9a644d@disroot.org> To: Inki Dae , Jagan Teki , Marek Szyprowski , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Seung-Woo Kim , Kyungmin Park , Krzysztof Kozlowski , Alim Akhtar Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, Kaustabh Chakraborty X-Developer-Signature: v=1; a=ed25519-sha256; t=1751826342; l=7642; i=kauschluss@disroot.org; s=20250202; h=from:subject:message-id; bh=sezB2gCswpH+5X4wtjHO7EgIJxpR2I20H2UdxlxKbhw=; b=YSDbnyRo0JWyo+i/N5TLD3qZDifxZYYJqAWtDasZwYC0zVYKDFJ+rxo+zzpzNstU1wyCrIZaL h0toq+NKBccCePdEUeFSlzI9StbtFd9Fxn4PqVCrreNGnRPj9g4gFhb X-Developer-Key: i=kauschluss@disroot.org; a=ed25519; pk=h2xeR+V2I1+GrfDPAhZa3M+NWA0Cnbdkkq1bH3ct1hE= DSIM_CLKCTRL bit and offset values hardcoded in the driver: name | bit/offset value --------------------------+----------------- DSIM_LANE_ESC_CLK_EN_CLK | 19 DSIM_LANE_ESC_CLK_EN_DATA | 20 DSIM_BYTE_CLKEN | 24 DSIM_ESC_CLKEN | 28 DSIM_TX_REQUEST_HSCLK | 31 DSIM_CLKCTRL bit and offset values in Exynos7870 DSIM as per downstream kernel sources: name | bit/offset value --------------------------+----------------- DSIM_LANE_ESC_CLK_EN_CLK | 8 DSIM_LANE_ESC_CLK_EN_DATA | 9 DSIM_BYTE_CLKEN | 17 DSIM_ESC_CLKEN | 16 DSIM_TX_REQUEST_HSCLK | 20 In order to support both, move all values to the driver data struct and define it for every driver compatible. Reference the values from there instead, in functions wherever required. Signed-off-by: Kaustabh Chakraborty --- drivers/gpu/drm/bridge/samsung-dsim.c | 76 +++++++++++++++++++++++++------= ---- include/drm/bridge/samsung-dsim.h | 5 +++ 2 files changed, 59 insertions(+), 22 deletions(-) diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge= /samsung-dsim.c index 84af24171b6856cbcf95b9077b997ee587fc0409..199c7ace78bfeb01d3ef9a841fe= 9339c0fb9f478 100644 --- a/drivers/gpu/drm/bridge/samsung-dsim.c +++ b/drivers/gpu/drm/bridge/samsung-dsim.c @@ -46,17 +46,13 @@ #define DSIM_BTA_TIMEOUT(x) ((x) << 16) =20 /* DSIM_CLKCTRL */ -#define DSIM_ESC_PRESCALER(x) (((x) & 0xffff) << 0) -#define DSIM_ESC_PRESCALER_MASK (0xffff << 0) -#define DSIM_LANE_ESC_CLK_EN_CLK BIT(19) -#define DSIM_LANE_ESC_CLK_EN_DATA(x) (((x) & 0xf) << 20) -#define DSIM_LANE_ESC_CLK_EN_DATA_MASK (0xf << 20) -#define DSIM_BYTE_CLKEN BIT(24) -#define DSIM_BYTE_CLK_SRC(x) (((x) & 0x3) << 25) -#define DSIM_BYTE_CLK_SRC_MASK (0x3 << 25) -#define DSIM_PLL_BYPASS BIT(27) -#define DSIM_ESC_CLKEN BIT(28) -#define DSIM_TX_REQUEST_HSCLK BIT(31) +#define DSIM_ESC_PRESCALER(x) (((x) & 0xffff) << 0) +#define DSIM_ESC_PRESCALER_MASK (0xffff << 0) +#define DSIM_LANE_ESC_CLK_EN_DATA(x, offset) (((x) & 0xf) << offset) +#define DSIM_LANE_ESC_CLK_EN_DATA_MASK(offset) (0xf << offset) +#define DSIM_BYTE_CLK_SRC(x) (((x) & 0x3) << 25) +#define DSIM_BYTE_CLK_SRC_MASK (0x3 << 25) +#define DSIM_PLL_BYPASS BIT(27) =20 /* DSIM_CONFIG */ #define DSIM_LANE_EN_CLK BIT(0) @@ -421,6 +417,11 @@ static const struct samsung_dsim_driver_data exynos3_d= si_driver_data =3D { .wait_for_hdr_fifo =3D 1, .wait_for_reset =3D 1, .num_bits_resol =3D 11, + .esc_clken_bit =3D 28, + .byte_clken_bit =3D 24, + .tx_req_hsclk_bit =3D 31, + .lane_esc_clk_bit =3D 19, + .lane_esc_data_offset =3D 20, .pll_p_offset =3D 13, .reg_values =3D reg_values, .pll_fin_min =3D 6, @@ -442,6 +443,11 @@ static const struct samsung_dsim_driver_data exynos4_d= si_driver_data =3D { .wait_for_hdr_fifo =3D 1, .wait_for_reset =3D 1, .num_bits_resol =3D 11, + .esc_clken_bit =3D 28, + .byte_clken_bit =3D 24, + .tx_req_hsclk_bit =3D 31, + .lane_esc_clk_bit =3D 19, + .lane_esc_data_offset =3D 20, .pll_p_offset =3D 13, .reg_values =3D reg_values, .pll_fin_min =3D 6, @@ -461,6 +467,11 @@ static const struct samsung_dsim_driver_data exynos5_d= si_driver_data =3D { .wait_for_hdr_fifo =3D 1, .wait_for_reset =3D 1, .num_bits_resol =3D 11, + .esc_clken_bit =3D 28, + .byte_clken_bit =3D 24, + .tx_req_hsclk_bit =3D 31, + .lane_esc_clk_bit =3D 19, + .lane_esc_data_offset =3D 20, .pll_p_offset =3D 13, .reg_values =3D reg_values, .pll_fin_min =3D 6, @@ -480,6 +491,11 @@ static const struct samsung_dsim_driver_data exynos543= 3_dsi_driver_data =3D { .wait_for_hdr_fifo =3D 1, .wait_for_reset =3D 0, .num_bits_resol =3D 12, + .esc_clken_bit =3D 28, + .byte_clken_bit =3D 24, + .tx_req_hsclk_bit =3D 31, + .lane_esc_clk_bit =3D 19, + .lane_esc_data_offset =3D 20, .pll_p_offset =3D 13, .reg_values =3D exynos5433_reg_values, .pll_fin_min =3D 6, @@ -499,6 +515,11 @@ static const struct samsung_dsim_driver_data exynos542= 2_dsi_driver_data =3D { .wait_for_hdr_fifo =3D 1, .wait_for_reset =3D 1, .num_bits_resol =3D 12, + .esc_clken_bit =3D 28, + .byte_clken_bit =3D 24, + .tx_req_hsclk_bit =3D 31, + .lane_esc_clk_bit =3D 19, + .lane_esc_data_offset =3D 20, .pll_p_offset =3D 13, .reg_values =3D exynos5422_reg_values, .pll_fin_min =3D 6, @@ -518,6 +539,11 @@ static const struct samsung_dsim_driver_data imx8mm_ds= i_driver_data =3D { .wait_for_hdr_fifo =3D 1, .wait_for_reset =3D 0, .num_bits_resol =3D 12, + .esc_clken_bit =3D 28, + .byte_clken_bit =3D 24, + .tx_req_hsclk_bit =3D 31, + .lane_esc_clk_bit =3D 19, + .lane_esc_data_offset =3D 20, /* * Unlike Exynos, PLL_P(PMS_P) offset 14 is used in i.MX8M Mini/Nano/Plus * downstream driver - drivers/gpu/drm/bridge/sec-dsim.c @@ -721,6 +747,7 @@ static unsigned long samsung_dsim_set_pll(struct samsun= g_dsim *dsi, =20 static int samsung_dsim_enable_clock(struct samsung_dsim *dsi) { + const struct samsung_dsim_driver_data *driver_data =3D dsi->driver_data; unsigned long hs_clk, byte_clk, esc_clk, pix_clk; unsigned long esc_div; u32 reg; @@ -754,15 +781,17 @@ static int samsung_dsim_enable_clock(struct samsung_d= sim *dsi) hs_clk, byte_clk, esc_clk); =20 reg =3D samsung_dsim_read(dsi, DSIM_CLKCTRL_REG); - reg &=3D ~(DSIM_ESC_PRESCALER_MASK | DSIM_LANE_ESC_CLK_EN_CLK - | DSIM_LANE_ESC_CLK_EN_DATA_MASK | DSIM_PLL_BYPASS - | DSIM_BYTE_CLK_SRC_MASK); - reg |=3D DSIM_ESC_CLKEN | DSIM_BYTE_CLKEN - | DSIM_ESC_PRESCALER(esc_div) - | DSIM_LANE_ESC_CLK_EN_CLK - | DSIM_LANE_ESC_CLK_EN_DATA(BIT(dsi->lanes) - 1) - | DSIM_BYTE_CLK_SRC(0) - | DSIM_TX_REQUEST_HSCLK; + reg &=3D ~(DSIM_ESC_PRESCALER_MASK | BIT(driver_data->lane_esc_clk_bit) + | DSIM_LANE_ESC_CLK_EN_DATA_MASK(driver_data->lane_esc_data_offset) + | DSIM_PLL_BYPASS + | DSIM_BYTE_CLK_SRC_MASK); + reg |=3D BIT(driver_data->esc_clken_bit) | BIT(driver_data->byte_clken_bi= t) + | DSIM_ESC_PRESCALER(esc_div) + | BIT(driver_data->lane_esc_clk_bit) + | DSIM_LANE_ESC_CLK_EN_DATA(BIT(dsi->lanes) - 1, + driver_data->lane_esc_data_offset) + | DSIM_BYTE_CLK_SRC(0) + | BIT(driver_data->tx_req_hsclk_bit); samsung_dsim_write(dsi, DSIM_CLKCTRL_REG, reg); =20 return 0; @@ -866,11 +895,14 @@ static void samsung_dsim_set_phy_ctrl(struct samsung_= dsim *dsi) =20 static void samsung_dsim_disable_clock(struct samsung_dsim *dsi) { + const struct samsung_dsim_driver_data *driver_data =3D dsi->driver_data; u32 reg; =20 reg =3D samsung_dsim_read(dsi, DSIM_CLKCTRL_REG); - reg &=3D ~(DSIM_LANE_ESC_CLK_EN_CLK | DSIM_LANE_ESC_CLK_EN_DATA_MASK - | DSIM_ESC_CLKEN | DSIM_BYTE_CLKEN); + reg &=3D ~(BIT(driver_data->lane_esc_clk_bit) + | DSIM_LANE_ESC_CLK_EN_DATA_MASK(driver_data->lane_esc_data_offset) + | BIT(driver_data->esc_clken_bit) + | BIT(driver_data->byte_clken_bit)); samsung_dsim_write(dsi, DSIM_CLKCTRL_REG, reg); =20 reg =3D samsung_dsim_read(dsi, DSIM_PLLCTRL_REG); diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung= -dsim.h index 62c07952bd00f9c2c287a6a998f0e243dd4032a9..b1e64c7f993189879d9549f147f= 7eebdf3b7ded4 100644 --- a/include/drm/bridge/samsung-dsim.h +++ b/include/drm/bridge/samsung-dsim.h @@ -64,6 +64,11 @@ struct samsung_dsim_driver_data { unsigned int wait_for_hdr_fifo; unsigned int wait_for_reset; unsigned int num_bits_resol; + unsigned int esc_clken_bit; + unsigned int byte_clken_bit; + unsigned int tx_req_hsclk_bit; + unsigned int lane_esc_clk_bit; + unsigned int lane_esc_data_offset; unsigned int pll_p_offset; const unsigned int *reg_values; unsigned int pll_fin_min; --=20 2.49.0