* [PATCH v2 00/13] Support for Exynos7870 DSIM bridge
@ 2025-06-26 19:38 Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 01/13] drm/bridge: samsung-dsim: separate LINK and DPHY status registers Kaustabh Chakraborty
` (12 more replies)
0 siblings, 13 replies; 17+ messages in thread
From: Kaustabh Chakraborty @ 2025-06-26 19:38 UTC (permalink / raw)
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, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc, Kaustabh Chakraborty
This patch series introduces a lot of changes to the existing DSIM
bridge driver, by introdcing new registers and making register offsets
configurable for different SoCs. These preliminary changes are followed
by the introduction of support for Exynos7870's DSIM IP block.
Work is heavily inspired and only possible due to Samsung's vendor
kernel sources. Testing has been done with Samsung Galaxy J7 Prime
(samsung-on7xelte), Samsung Galaxy A2 Core (samsung-a2corelte), and
Samsung Galaxy J6 (samsung-j6lte), all with DSI video mode panels.
Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
---
Changes in v2:
- added commit to isolate clock names for each variant
- replaced clock names with generic ones
- added maxItems to clocks property in dtschema
- Link to v1: https://lore.kernel.org/r/20250612-exynos7870-dsim-v1-0-1a330bca89df@disroot.org
---
Kaustabh Chakraborty (13):
drm/bridge: samsung-dsim: separate LINK and DPHY status registers
drm/bridge: samsung-dsim: add SFRCTRL register
drm/bridge: samsung-dsim: add flag to control header FIFO wait
drm/bridge: samsung-dsim: allow configuring bits and offsets of CLKCTRL register
drm/bridge: samsung-dsim: allow configuring the MAIN_VSA offset
drm/bridge: samsung-dsim: allow configuring the VIDEO_MODE bit
drm/bridge: samsung-dsim: allow configuring PLL_M and PLL_S offsets
drm/bridge: samsung-dsim: allow configuring the PLL_STABLE bit
drm/bridge: samsung-dsim: increase timeout value for PLL_STABLE
drm/bridge: samsung-dsim: add ability to define clock names for every variant
dt-bindings: samsung,mipi-dsim: document exynos7870 DSIM compatible
drm/bridge: samsung-dsim: add driver support for exynos7870 DSIM bridge
drm/exynos: dsi: add support for exynos7870
.../bindings/display/bridge/samsung,mipi-dsim.yaml | 27 ++
drivers/gpu/drm/bridge/samsung-dsim.c | 346 +++++++++++++++------
drivers/gpu/drm/exynos/exynos_drm_dsi.c | 9 +
include/drm/bridge/samsung-dsim.h | 15 +-
4 files changed, 307 insertions(+), 90 deletions(-)
---
base-commit: 1b152eeca84a02bdb648f16b82ef3394007a9dcf
change-id: 20250523-exynos7870-dsim-f29d6eafca52
Best regards,
--
Kaustabh Chakraborty <kauschluss@disroot.org>
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 01/13] drm/bridge: samsung-dsim: separate LINK and DPHY status registers
2025-06-26 19:38 [PATCH v2 00/13] Support for Exynos7870 DSIM bridge Kaustabh Chakraborty
@ 2025-06-26 19:38 ` Kaustabh Chakraborty
2025-06-27 10:07 ` Inki Dae
2025-06-26 19:38 ` [PATCH v2 02/13] drm/bridge: samsung-dsim: add SFRCTRL register Kaustabh Chakraborty
` (11 subsequent siblings)
12 siblings, 1 reply; 17+ messages in thread
From: Kaustabh Chakraborty @ 2025-06-26 19:38 UTC (permalink / raw)
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, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc, Kaustabh Chakraborty
Exynos7870's DSIM has separate registers for LINK and DPHY status. This
is in contrast to other devices in the driver which use a single
register for both.
Add their respective entries in the register list. Devices having a
single status register have been assigned the same offset for both
entries.
Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
---
drivers/gpu/drm/bridge/samsung-dsim.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index f2f666b27d2d5ec016d7a7f47c87fcdf1377d41a..7fd4c34cdc3170d363942f98feec048097da3c06 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -30,7 +30,7 @@
/* returns true iff both arguments logically differs */
#define NEQV(a, b) (!(a) ^ !(b))
-/* DSIM_STATUS */
+/* DSIM_DPHY_STATUS */
#define DSIM_STOP_STATE_DAT(x) (((x) & 0xf) << 0)
#define DSIM_STOP_STATE_CLK BIT(8)
#define DSIM_TX_READY_HS_CLK BIT(10)
@@ -239,7 +239,8 @@ enum samsung_dsim_transfer_type {
};
enum reg_idx {
- DSIM_STATUS_REG, /* Status register */
+ DSIM_LINK_STATUS_REG, /* Link status register */
+ DSIM_DPHY_STATUS_REG, /* D-PHY status register */
DSIM_SWRST_REG, /* Software reset register */
DSIM_CLKCTRL_REG, /* Clock control register */
DSIM_TIMEOUT_REG, /* Time out register */
@@ -264,7 +265,8 @@ enum reg_idx {
};
static const unsigned int exynos_reg_ofs[] = {
- [DSIM_STATUS_REG] = 0x00,
+ [DSIM_LINK_STATUS_REG] = 0x00,
+ [DSIM_DPHY_STATUS_REG] = 0x00,
[DSIM_SWRST_REG] = 0x04,
[DSIM_CLKCTRL_REG] = 0x08,
[DSIM_TIMEOUT_REG] = 0x0c,
@@ -288,7 +290,8 @@ static const unsigned int exynos_reg_ofs[] = {
};
static const unsigned int exynos5433_reg_ofs[] = {
- [DSIM_STATUS_REG] = 0x04,
+ [DSIM_LINK_STATUS_REG] = 0x04,
+ [DSIM_DPHY_STATUS_REG] = 0x04,
[DSIM_SWRST_REG] = 0x0C,
[DSIM_CLKCTRL_REG] = 0x10,
[DSIM_TIMEOUT_REG] = 0x14,
@@ -690,7 +693,7 @@ static unsigned long samsung_dsim_set_pll(struct samsung_dsim *dsi,
dev_err(dsi->dev, "PLL failed to stabilize\n");
return 0;
}
- reg = samsung_dsim_read(dsi, DSIM_STATUS_REG);
+ reg = samsung_dsim_read(dsi, DSIM_LINK_STATUS_REG);
} while ((reg & DSIM_PLL_STABLE) == 0);
dsi->hs_clock = fout;
@@ -966,7 +969,7 @@ static int samsung_dsim_init_link(struct samsung_dsim *dsi)
return -EFAULT;
}
- reg = samsung_dsim_read(dsi, DSIM_STATUS_REG);
+ reg = samsung_dsim_read(dsi, DSIM_DPHY_STATUS_REG);
if ((reg & DSIM_STOP_STATE_DAT(lanes_mask))
!= DSIM_STOP_STATE_DAT(lanes_mask))
continue;
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 02/13] drm/bridge: samsung-dsim: add SFRCTRL register
2025-06-26 19:38 [PATCH v2 00/13] Support for Exynos7870 DSIM bridge Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 01/13] drm/bridge: samsung-dsim: separate LINK and DPHY status registers Kaustabh Chakraborty
@ 2025-06-26 19:38 ` Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 03/13] drm/bridge: samsung-dsim: add flag to control header FIFO wait Kaustabh Chakraborty
` (10 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Kaustabh Chakraborty @ 2025-06-26 19:38 UTC (permalink / raw)
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, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc, Kaustabh Chakraborty
On Exynos7870 devices, enabling the display requires disabling
standby by writing to the SFRCTRL register. Add the register and related
bit values. Since this behavior isn't available on other SoCs, implement
a flag in the driver data struct indicating the availability of this
feature.
Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
---
drivers/gpu/drm/bridge/samsung-dsim.c | 16 ++++++++++++++++
include/drm/bridge/samsung-dsim.h | 1 +
2 files changed, 17 insertions(+)
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index 7fd4c34cdc3170d363942f98feec048097da3c06..3c716334f1a21bf446ebe17f810d5258dd9a4c24 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -156,6 +156,11 @@
#define DSIM_INT_RX_ECC_ERR BIT(15)
#define DSIM_INT_RX_CRC_ERR BIT(14)
+/* DSIM_SFRCTRL */
+#define DSIM_SFR_CTRL_STAND_BY BIT(4)
+#define DSIM_SFR_CTRL_SHADOW_UPDATE BIT(1)
+#define DSIM_SFR_CTRL_SHADOW_EN BIT(0)
+
/* DSIM_FIFOCTRL */
#define DSIM_RX_DATA_FULL BIT(25)
#define DSIM_RX_DATA_EMPTY BIT(24)
@@ -255,6 +260,7 @@ enum reg_idx {
DSIM_PKTHDR_REG, /* Packet Header FIFO register */
DSIM_PAYLOAD_REG, /* Payload FIFO register */
DSIM_RXFIFO_REG, /* Read FIFO register */
+ DSIM_SFRCTRL_REG, /* SFR standby and shadow control register */
DSIM_FIFOCTRL_REG, /* FIFO status and control register */
DSIM_PLLCTRL_REG, /* PLL control register */
DSIM_PHYCTRL_REG,
@@ -1030,6 +1036,7 @@ static void samsung_dsim_set_display_mode(struct samsung_dsim *dsi)
static void samsung_dsim_set_display_enable(struct samsung_dsim *dsi, bool enable)
{
+ const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
u32 reg;
reg = samsung_dsim_read(dsi, DSIM_MDRESOL_REG);
@@ -1038,6 +1045,15 @@ static void samsung_dsim_set_display_enable(struct samsung_dsim *dsi, bool enabl
else
reg &= ~DSIM_MAIN_STAND_BY;
samsung_dsim_write(dsi, DSIM_MDRESOL_REG, reg);
+
+ if (driver_data->has_sfrctrl) {
+ reg = samsung_dsim_read(dsi, DSIM_SFRCTRL_REG);
+ if (enable)
+ reg |= DSIM_SFR_CTRL_STAND_BY;
+ else
+ reg &= ~DSIM_SFR_CTRL_STAND_BY;
+ samsung_dsim_write(dsi, DSIM_SFRCTRL_REG, reg);
+ }
}
static int samsung_dsim_wait_for_hdr_fifo(struct samsung_dsim *dsi)
diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h
index 9764d6eb5beb98b5b9427c5c4775c37b24dd6e17..a50e4f521b9d9561f6a3b9fe3e174c0e140849a2 100644
--- a/include/drm/bridge/samsung-dsim.h
+++ b/include/drm/bridge/samsung-dsim.h
@@ -56,6 +56,7 @@ struct samsung_dsim_driver_data {
unsigned int has_freqband:1;
unsigned int has_clklane_stop:1;
unsigned int has_broken_fifoctrl_emptyhdr:1;
+ unsigned int has_sfrctrl:1;
unsigned int num_clks;
unsigned int min_freq;
unsigned int max_freq;
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 03/13] drm/bridge: samsung-dsim: add flag to control header FIFO wait
2025-06-26 19:38 [PATCH v2 00/13] Support for Exynos7870 DSIM bridge Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 01/13] drm/bridge: samsung-dsim: separate LINK and DPHY status registers Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 02/13] drm/bridge: samsung-dsim: add SFRCTRL register Kaustabh Chakraborty
@ 2025-06-26 19:38 ` Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 04/13] drm/bridge: samsung-dsim: allow configuring bits and offsets of CLKCTRL register Kaustabh Chakraborty
` (9 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Kaustabh Chakraborty @ 2025-06-26 19:38 UTC (permalink / raw)
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, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc, Kaustabh Chakraborty
Exynos7870's DSIM device doesn't require waiting for the header FIFO
during a MIPI DSI transfer. Add a flag in the driver data in order to
control said behavior.
Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
---
drivers/gpu/drm/bridge/samsung-dsim.c | 15 ++++++++++++---
include/drm/bridge/samsung-dsim.h | 1 +
2 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index 3c716334f1a21bf446ebe17f810d5258dd9a4c24..112d558579d8f987c695e1704a5772ebbadfd625 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -417,6 +417,7 @@ static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = {
.has_clklane_stop = 1,
.num_clks = 2,
.max_freq = 1000,
+ .wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
.num_bits_resol = 11,
.pll_p_offset = 13,
@@ -436,6 +437,7 @@ static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
.has_clklane_stop = 1,
.num_clks = 2,
.max_freq = 1000,
+ .wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
.num_bits_resol = 11,
.pll_p_offset = 13,
@@ -453,6 +455,7 @@ static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = {
.plltmr_reg = 0x58,
.num_clks = 2,
.max_freq = 1000,
+ .wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
.num_bits_resol = 11,
.pll_p_offset = 13,
@@ -470,6 +473,7 @@ static const struct samsung_dsim_driver_data exynos5433_dsi_driver_data = {
.has_clklane_stop = 1,
.num_clks = 5,
.max_freq = 1500,
+ .wait_for_hdr_fifo = 1,
.wait_for_reset = 0,
.num_bits_resol = 12,
.pll_p_offset = 13,
@@ -487,6 +491,7 @@ static const struct samsung_dsim_driver_data exynos5422_dsi_driver_data = {
.has_clklane_stop = 1,
.num_clks = 2,
.max_freq = 1500,
+ .wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
.num_bits_resol = 12,
.pll_p_offset = 13,
@@ -504,6 +509,7 @@ static const struct samsung_dsim_driver_data imx8mm_dsi_driver_data = {
.has_clklane_stop = 1,
.num_clks = 2,
.max_freq = 2100,
+ .wait_for_hdr_fifo = 1,
.wait_for_reset = 0,
.num_bits_resol = 12,
/*
@@ -1110,6 +1116,7 @@ static void samsung_dsim_send_to_fifo(struct samsung_dsim *dsi,
{
struct device *dev = dsi->dev;
struct mipi_dsi_packet *pkt = &xfer->packet;
+ const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
const u8 *payload = pkt->payload + xfer->tx_done;
u16 length = pkt->payload_length - xfer->tx_done;
bool first = !xfer->tx_done;
@@ -1150,9 +1157,11 @@ static void samsung_dsim_send_to_fifo(struct samsung_dsim *dsi,
return;
reg = get_unaligned_le32(pkt->header);
- if (samsung_dsim_wait_for_hdr_fifo(dsi)) {
- dev_err(dev, "waiting for header FIFO timed out\n");
- return;
+ if (driver_data->wait_for_hdr_fifo) {
+ if (samsung_dsim_wait_for_hdr_fifo(dsi)) {
+ dev_err(dev, "waiting for header FIFO timed out\n");
+ return;
+ }
}
if (NEQV(xfer->flags & MIPI_DSI_MSG_USE_LPM,
diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h
index a50e4f521b9d9561f6a3b9fe3e174c0e140849a2..3641c57557f42fd90cd2e8c0282f69dbe36ba2de 100644
--- a/include/drm/bridge/samsung-dsim.h
+++ b/include/drm/bridge/samsung-dsim.h
@@ -60,6 +60,7 @@ struct samsung_dsim_driver_data {
unsigned int num_clks;
unsigned int min_freq;
unsigned int max_freq;
+ unsigned int wait_for_hdr_fifo;
unsigned int wait_for_reset;
unsigned int num_bits_resol;
unsigned int pll_p_offset;
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 04/13] drm/bridge: samsung-dsim: allow configuring bits and offsets of CLKCTRL register
2025-06-26 19:38 [PATCH v2 00/13] Support for Exynos7870 DSIM bridge Kaustabh Chakraborty
` (2 preceding siblings ...)
2025-06-26 19:38 ` [PATCH v2 03/13] drm/bridge: samsung-dsim: add flag to control header FIFO wait Kaustabh Chakraborty
@ 2025-06-26 19:38 ` Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 05/13] drm/bridge: samsung-dsim: allow configuring the MAIN_VSA offset Kaustabh Chakraborty
` (8 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Kaustabh Chakraborty @ 2025-06-26 19:38 UTC (permalink / raw)
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, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc, Kaustabh Chakraborty
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 <kauschluss@disroot.org>
---
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 112d558579d8f987c695e1704a5772ebbadfd625..c85c7c3af74ebce9732f9531ba5c31d992a19a23 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -45,17 +45,13 @@
#define DSIM_BTA_TIMEOUT(x) ((x) << 16)
/* 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)
/* DSIM_CONFIG */
#define DSIM_LANE_EN_CLK BIT(0)
@@ -420,6 +416,11 @@ static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = {
.wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
.num_bits_resol = 11,
+ .esc_clken_bit = 28,
+ .byte_clken_bit = 24,
+ .tx_req_hsclk_bit = 31,
+ .lane_esc_clk_bit = 19,
+ .lane_esc_data_offset = 20,
.pll_p_offset = 13,
.reg_values = reg_values,
.pll_fin_min = 6,
@@ -440,6 +441,11 @@ static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
.wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
.num_bits_resol = 11,
+ .esc_clken_bit = 28,
+ .byte_clken_bit = 24,
+ .tx_req_hsclk_bit = 31,
+ .lane_esc_clk_bit = 19,
+ .lane_esc_data_offset = 20,
.pll_p_offset = 13,
.reg_values = reg_values,
.pll_fin_min = 6,
@@ -458,6 +464,11 @@ static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = {
.wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
.num_bits_resol = 11,
+ .esc_clken_bit = 28,
+ .byte_clken_bit = 24,
+ .tx_req_hsclk_bit = 31,
+ .lane_esc_clk_bit = 19,
+ .lane_esc_data_offset = 20,
.pll_p_offset = 13,
.reg_values = reg_values,
.pll_fin_min = 6,
@@ -476,6 +487,11 @@ static const struct samsung_dsim_driver_data exynos5433_dsi_driver_data = {
.wait_for_hdr_fifo = 1,
.wait_for_reset = 0,
.num_bits_resol = 12,
+ .esc_clken_bit = 28,
+ .byte_clken_bit = 24,
+ .tx_req_hsclk_bit = 31,
+ .lane_esc_clk_bit = 19,
+ .lane_esc_data_offset = 20,
.pll_p_offset = 13,
.reg_values = exynos5433_reg_values,
.pll_fin_min = 6,
@@ -494,6 +510,11 @@ static const struct samsung_dsim_driver_data exynos5422_dsi_driver_data = {
.wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
.num_bits_resol = 12,
+ .esc_clken_bit = 28,
+ .byte_clken_bit = 24,
+ .tx_req_hsclk_bit = 31,
+ .lane_esc_clk_bit = 19,
+ .lane_esc_data_offset = 20,
.pll_p_offset = 13,
.reg_values = exynos5422_reg_values,
.pll_fin_min = 6,
@@ -512,6 +533,11 @@ static const struct samsung_dsim_driver_data imx8mm_dsi_driver_data = {
.wait_for_hdr_fifo = 1,
.wait_for_reset = 0,
.num_bits_resol = 12,
+ .esc_clken_bit = 28,
+ .byte_clken_bit = 24,
+ .tx_req_hsclk_bit = 31,
+ .lane_esc_clk_bit = 19,
+ .lane_esc_data_offset = 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
@@ -715,6 +741,7 @@ static unsigned long samsung_dsim_set_pll(struct samsung_dsim *dsi,
static int samsung_dsim_enable_clock(struct samsung_dsim *dsi)
{
+ const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
unsigned long hs_clk, byte_clk, esc_clk, pix_clk;
unsigned long esc_div;
u32 reg;
@@ -748,15 +775,17 @@ static int samsung_dsim_enable_clock(struct samsung_dsim *dsi)
hs_clk, byte_clk, esc_clk);
reg = samsung_dsim_read(dsi, DSIM_CLKCTRL_REG);
- reg &= ~(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 |= 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 &= ~(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 |= BIT(driver_data->esc_clken_bit) | BIT(driver_data->byte_clken_bit)
+ | 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);
return 0;
@@ -860,11 +889,14 @@ static void samsung_dsim_set_phy_ctrl(struct samsung_dsim *dsi)
static void samsung_dsim_disable_clock(struct samsung_dsim *dsi)
{
+ const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
u32 reg;
reg = samsung_dsim_read(dsi, DSIM_CLKCTRL_REG);
- reg &= ~(DSIM_LANE_ESC_CLK_EN_CLK | DSIM_LANE_ESC_CLK_EN_DATA_MASK
- | DSIM_ESC_CLKEN | DSIM_BYTE_CLKEN);
+ reg &= ~(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);
reg = samsung_dsim_read(dsi, DSIM_PLLCTRL_REG);
diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h
index 3641c57557f42fd90cd2e8c0282f69dbe36ba2de..8938eccf78730019e0404101c855dc2d7d225668 100644
--- a/include/drm/bridge/samsung-dsim.h
+++ b/include/drm/bridge/samsung-dsim.h
@@ -63,6 +63,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;
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 05/13] drm/bridge: samsung-dsim: allow configuring the MAIN_VSA offset
2025-06-26 19:38 [PATCH v2 00/13] Support for Exynos7870 DSIM bridge Kaustabh Chakraborty
` (3 preceding siblings ...)
2025-06-26 19:38 ` [PATCH v2 04/13] drm/bridge: samsung-dsim: allow configuring bits and offsets of CLKCTRL register Kaustabh Chakraborty
@ 2025-06-26 19:38 ` Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 06/13] drm/bridge: samsung-dsim: allow configuring the VIDEO_MODE bit Kaustabh Chakraborty
` (7 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Kaustabh Chakraborty @ 2025-06-26 19:38 UTC (permalink / raw)
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, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc, Kaustabh Chakraborty
The MAIN_VSA offset of DSIM_MSYNC is hardcoded to a 22-bit offset, but
Exynos7870's DSIM has it in a 16-bit offset as per the downstream kernel
sources.
In order to support both, move this offset value to the driver data
struct and define it for every driver compatible. Reference the value
from there instead, in functions wherever required.
Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
---
drivers/gpu/drm/bridge/samsung-dsim.c | 13 ++++++++++---
include/drm/bridge/samsung-dsim.h | 1 +
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index c85c7c3af74ebce9732f9531ba5c31d992a19a23..c61524b6daf936b904743af4487cfb172dd687f0 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -124,9 +124,9 @@
#define DSIM_MAIN_HBP_MASK ((0xffff) << 0)
/* DSIM_MSYNC */
-#define DSIM_MAIN_VSA(x) ((x) << 22)
+#define DSIM_MAIN_VSA(x, offset) ((x) << offset)
#define DSIM_MAIN_HSA(x) ((x) << 0)
-#define DSIM_MAIN_VSA_MASK ((0x3ff) << 22)
+#define DSIM_MAIN_VSA_MASK(offset) ((0x3ff) << offset)
#define DSIM_MAIN_HSA_MASK ((0xffff) << 0)
/* DSIM_SDRESOL */
@@ -422,6 +422,7 @@ static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = {
.lane_esc_clk_bit = 19,
.lane_esc_data_offset = 20,
.pll_p_offset = 13,
+ .main_vsa_offset = 22,
.reg_values = reg_values,
.pll_fin_min = 6,
.pll_fin_max = 12,
@@ -447,6 +448,7 @@ static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
.lane_esc_clk_bit = 19,
.lane_esc_data_offset = 20,
.pll_p_offset = 13,
+ .main_vsa_offset = 22,
.reg_values = reg_values,
.pll_fin_min = 6,
.pll_fin_max = 12,
@@ -470,6 +472,7 @@ static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = {
.lane_esc_clk_bit = 19,
.lane_esc_data_offset = 20,
.pll_p_offset = 13,
+ .main_vsa_offset = 22,
.reg_values = reg_values,
.pll_fin_min = 6,
.pll_fin_max = 12,
@@ -493,6 +496,7 @@ static const struct samsung_dsim_driver_data exynos5433_dsi_driver_data = {
.lane_esc_clk_bit = 19,
.lane_esc_data_offset = 20,
.pll_p_offset = 13,
+ .main_vsa_offset = 22,
.reg_values = exynos5433_reg_values,
.pll_fin_min = 6,
.pll_fin_max = 12,
@@ -516,6 +520,7 @@ static const struct samsung_dsim_driver_data exynos5422_dsi_driver_data = {
.lane_esc_clk_bit = 19,
.lane_esc_data_offset = 20,
.pll_p_offset = 13,
+ .main_vsa_offset = 22,
.reg_values = exynos5422_reg_values,
.pll_fin_min = 6,
.pll_fin_max = 12,
@@ -543,6 +548,7 @@ static const struct samsung_dsim_driver_data imx8mm_dsi_driver_data = {
* downstream driver - drivers/gpu/drm/bridge/sec-dsim.c
*/
.pll_p_offset = 14,
+ .main_vsa_offset = 22,
.reg_values = imx8mm_dsim_reg_values,
.pll_fin_min = 2,
.pll_fin_max = 30,
@@ -1034,6 +1040,7 @@ static void samsung_dsim_set_display_mode(struct samsung_dsim *dsi)
{
struct drm_display_mode *m = &dsi->mode;
unsigned int num_bits_resol = dsi->driver_data->num_bits_resol;
+ unsigned int main_vsa_offset = dsi->driver_data->main_vsa_offset;
u32 reg;
if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
@@ -1060,7 +1067,7 @@ static void samsung_dsim_set_display_mode(struct samsung_dsim *dsi)
reg = DSIM_MAIN_HFP(hfp) | DSIM_MAIN_HBP(hbp);
samsung_dsim_write(dsi, DSIM_MHPORCH_REG, reg);
- reg = DSIM_MAIN_VSA(m->vsync_end - m->vsync_start)
+ reg = DSIM_MAIN_VSA(m->vsync_end - m->vsync_start, main_vsa_offset)
| DSIM_MAIN_HSA(hsa);
samsung_dsim_write(dsi, DSIM_MSYNC_REG, reg);
}
diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h
index 8938eccf78730019e0404101c855dc2d7d225668..a5f13f224b0817fe3135edd77276c4e715219cda 100644
--- a/include/drm/bridge/samsung-dsim.h
+++ b/include/drm/bridge/samsung-dsim.h
@@ -69,6 +69,7 @@ struct samsung_dsim_driver_data {
unsigned int lane_esc_clk_bit;
unsigned int lane_esc_data_offset;
unsigned int pll_p_offset;
+ unsigned int main_vsa_offset;
const unsigned int *reg_values;
unsigned int pll_fin_min;
unsigned int pll_fin_max;
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 06/13] drm/bridge: samsung-dsim: allow configuring the VIDEO_MODE bit
2025-06-26 19:38 [PATCH v2 00/13] Support for Exynos7870 DSIM bridge Kaustabh Chakraborty
` (4 preceding siblings ...)
2025-06-26 19:38 ` [PATCH v2 05/13] drm/bridge: samsung-dsim: allow configuring the MAIN_VSA offset Kaustabh Chakraborty
@ 2025-06-26 19:38 ` Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 07/13] drm/bridge: samsung-dsim: allow configuring PLL_M and PLL_S offsets Kaustabh Chakraborty
` (6 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Kaustabh Chakraborty @ 2025-06-26 19:38 UTC (permalink / raw)
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, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc, Kaustabh Chakraborty
The VIDEO_MODE bit of DSIM_CONFIG is hardcoded to BIT(25), but
Exynos7870's DSIM has it in BIT(18) as per downstream kernel sources.
In order to support both, move this bit value to the driver data struct
and define it for every driver compatible. Reference the value from
there instead, in functions wherever required.
Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
---
drivers/gpu/drm/bridge/samsung-dsim.c | 9 +++++++--
include/drm/bridge/samsung-dsim.h | 1 +
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index c61524b6daf936b904743af4487cfb172dd687f0..0ebf0037d181ff6a4c54df1048593c97cc89f2eb 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -86,7 +86,6 @@
*/
#define DSIM_HSE_DISABLE_MODE BIT(23)
#define DSIM_AUTO_MODE BIT(24)
-#define DSIM_VIDEO_MODE BIT(25)
#define DSIM_BURST_MODE BIT(26)
#define DSIM_SYNC_INFORM BIT(27)
#define DSIM_EOT_DISABLE BIT(28)
@@ -416,6 +415,7 @@ static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = {
.wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
.num_bits_resol = 11,
+ .video_mode_bit = 25,
.esc_clken_bit = 28,
.byte_clken_bit = 24,
.tx_req_hsclk_bit = 31,
@@ -442,6 +442,7 @@ static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
.wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
.num_bits_resol = 11,
+ .video_mode_bit = 25,
.esc_clken_bit = 28,
.byte_clken_bit = 24,
.tx_req_hsclk_bit = 31,
@@ -466,6 +467,7 @@ static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = {
.wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
.num_bits_resol = 11,
+ .video_mode_bit = 25,
.esc_clken_bit = 28,
.byte_clken_bit = 24,
.tx_req_hsclk_bit = 31,
@@ -490,6 +492,7 @@ static const struct samsung_dsim_driver_data exynos5433_dsi_driver_data = {
.wait_for_hdr_fifo = 1,
.wait_for_reset = 0,
.num_bits_resol = 12,
+ .video_mode_bit = 25,
.esc_clken_bit = 28,
.byte_clken_bit = 24,
.tx_req_hsclk_bit = 31,
@@ -514,6 +517,7 @@ static const struct samsung_dsim_driver_data exynos5422_dsi_driver_data = {
.wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
.num_bits_resol = 12,
+ .video_mode_bit = 25,
.esc_clken_bit = 28,
.byte_clken_bit = 24,
.tx_req_hsclk_bit = 31,
@@ -538,6 +542,7 @@ static const struct samsung_dsim_driver_data imx8mm_dsi_driver_data = {
.wait_for_hdr_fifo = 1,
.wait_for_reset = 0,
.num_bits_resol = 12,
+ .video_mode_bit = 25,
.esc_clken_bit = 28,
.byte_clken_bit = 24,
.tx_req_hsclk_bit = 31,
@@ -946,7 +951,7 @@ static int samsung_dsim_init_link(struct samsung_dsim *dsi)
* mode, otherwise it will support command mode.
*/
if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
- reg |= DSIM_VIDEO_MODE;
+ reg |= BIT(driver_data->video_mode_bit);
/*
* The user manual describes that following bits are ignored in
diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h
index a5f13f224b0817fe3135edd77276c4e715219cda..f364fd2703c3644e822df30408d82cc3d6206b05 100644
--- a/include/drm/bridge/samsung-dsim.h
+++ b/include/drm/bridge/samsung-dsim.h
@@ -63,6 +63,7 @@ struct samsung_dsim_driver_data {
unsigned int wait_for_hdr_fifo;
unsigned int wait_for_reset;
unsigned int num_bits_resol;
+ unsigned int video_mode_bit;
unsigned int esc_clken_bit;
unsigned int byte_clken_bit;
unsigned int tx_req_hsclk_bit;
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 07/13] drm/bridge: samsung-dsim: allow configuring PLL_M and PLL_S offsets
2025-06-26 19:38 [PATCH v2 00/13] Support for Exynos7870 DSIM bridge Kaustabh Chakraborty
` (5 preceding siblings ...)
2025-06-26 19:38 ` [PATCH v2 06/13] drm/bridge: samsung-dsim: allow configuring the VIDEO_MODE bit Kaustabh Chakraborty
@ 2025-06-26 19:38 ` Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 08/13] drm/bridge: samsung-dsim: allow configuring the PLL_STABLE bit Kaustabh Chakraborty
` (5 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Kaustabh Chakraborty @ 2025-06-26 19:38 UTC (permalink / raw)
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, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc, Kaustabh Chakraborty
Currently, PLL_P offset of DSIM_PLLCTRL is configurable in the driver
data, while PLL_M and PLL_S offsets are hardcoded as 4-bit and 1-bit
offsets respectively, but Exynos7870's DSIM have them at 3-bit and 0-bit
offsets as per downstream kernel sources.
In order to support both, move both offset 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 <kauschluss@disroot.org>
---
drivers/gpu/drm/bridge/samsung-dsim.c | 21 ++++++++++++++++-----
include/drm/bridge/samsung-dsim.h | 2 ++
2 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index 0ebf0037d181ff6a4c54df1048593c97cc89f2eb..5993f8ef5d3641f69e557a79819ce0ba54762efb 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -190,9 +190,7 @@
#define DSIM_PLL_DPDNSWAP_DAT (1 << 24)
#define DSIM_FREQ_BAND(x) ((x) << 24)
#define DSIM_PLL_EN BIT(23)
-#define DSIM_PLL_P(x, offset) ((x) << (offset))
-#define DSIM_PLL_M(x) ((x) << 4)
-#define DSIM_PLL_S(x) ((x) << 1)
+#define DSIM_PLL(x, offset) ((x) << (offset))
/* DSIM_PHYCTRL */
#define DSIM_PHYCTRL_ULPS_EXIT(x) (((x) & 0x1ff) << 0)
@@ -422,6 +420,8 @@ static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = {
.lane_esc_clk_bit = 19,
.lane_esc_data_offset = 20,
.pll_p_offset = 13,
+ .pll_m_offset = 4,
+ .pll_s_offset = 1,
.main_vsa_offset = 22,
.reg_values = reg_values,
.pll_fin_min = 6,
@@ -449,6 +449,8 @@ static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
.lane_esc_clk_bit = 19,
.lane_esc_data_offset = 20,
.pll_p_offset = 13,
+ .pll_m_offset = 4,
+ .pll_s_offset = 1,
.main_vsa_offset = 22,
.reg_values = reg_values,
.pll_fin_min = 6,
@@ -474,6 +476,8 @@ static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = {
.lane_esc_clk_bit = 19,
.lane_esc_data_offset = 20,
.pll_p_offset = 13,
+ .pll_m_offset = 4,
+ .pll_s_offset = 1,
.main_vsa_offset = 22,
.reg_values = reg_values,
.pll_fin_min = 6,
@@ -499,6 +503,8 @@ static const struct samsung_dsim_driver_data exynos5433_dsi_driver_data = {
.lane_esc_clk_bit = 19,
.lane_esc_data_offset = 20,
.pll_p_offset = 13,
+ .pll_m_offset = 4,
+ .pll_s_offset = 1,
.main_vsa_offset = 22,
.reg_values = exynos5433_reg_values,
.pll_fin_min = 6,
@@ -524,6 +530,8 @@ static const struct samsung_dsim_driver_data exynos5422_dsi_driver_data = {
.lane_esc_clk_bit = 19,
.lane_esc_data_offset = 20,
.pll_p_offset = 13,
+ .pll_m_offset = 4,
+ .pll_s_offset = 1,
.main_vsa_offset = 22,
.reg_values = exynos5422_reg_values,
.pll_fin_min = 6,
@@ -553,6 +561,8 @@ static const struct samsung_dsim_driver_data imx8mm_dsi_driver_data = {
* downstream driver - drivers/gpu/drm/bridge/sec-dsim.c
*/
.pll_p_offset = 14,
+ .pll_m_offset = 4,
+ .pll_s_offset = 1,
.main_vsa_offset = 22,
.reg_values = imx8mm_dsim_reg_values,
.pll_fin_min = 2,
@@ -708,8 +718,9 @@ static unsigned long samsung_dsim_set_pll(struct samsung_dsim *dsi,
writel(driver_data->reg_values[PLL_TIMER],
dsi->reg_base + driver_data->plltmr_reg);
- reg = DSIM_PLL_EN | DSIM_PLL_P(p, driver_data->pll_p_offset) |
- DSIM_PLL_M(m) | DSIM_PLL_S(s);
+ reg = DSIM_PLL_EN | DSIM_PLL(p, driver_data->pll_p_offset)
+ | DSIM_PLL(m, driver_data->pll_m_offset)
+ | DSIM_PLL(s, driver_data->pll_s_offset);
if (driver_data->has_freqband) {
static const unsigned long freq_bands[] = {
diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h
index f364fd2703c3644e822df30408d82cc3d6206b05..def9b4c6ef28eede8175aaa84c495c5444d0f103 100644
--- a/include/drm/bridge/samsung-dsim.h
+++ b/include/drm/bridge/samsung-dsim.h
@@ -70,6 +70,8 @@ struct samsung_dsim_driver_data {
unsigned int lane_esc_clk_bit;
unsigned int lane_esc_data_offset;
unsigned int pll_p_offset;
+ unsigned int pll_m_offset;
+ unsigned int pll_s_offset;
unsigned int main_vsa_offset;
const unsigned int *reg_values;
unsigned int pll_fin_min;
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 08/13] drm/bridge: samsung-dsim: allow configuring the PLL_STABLE bit
2025-06-26 19:38 [PATCH v2 00/13] Support for Exynos7870 DSIM bridge Kaustabh Chakraborty
` (6 preceding siblings ...)
2025-06-26 19:38 ` [PATCH v2 07/13] drm/bridge: samsung-dsim: allow configuring PLL_M and PLL_S offsets Kaustabh Chakraborty
@ 2025-06-26 19:38 ` Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 09/13] drm/bridge: samsung-dsim: increase timeout value for PLL_STABLE Kaustabh Chakraborty
` (4 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Kaustabh Chakraborty @ 2025-06-26 19:38 UTC (permalink / raw)
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, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc, Kaustabh Chakraborty
The PLL_STABLE bit of DSIM_DPHY_STATUS is hardcoded to BIT(31), but
Exynos7870's DSIM has it in BIT(24) as per downstream kernel sources.
In order to support both, move this bit value to the driver data struct
and define it for every driver compatible. Reference the value from
there instead, in functions wherever required.
Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
---
drivers/gpu/drm/bridge/samsung-dsim.c | 9 +++++++--
include/drm/bridge/samsung-dsim.h | 1 +
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index 5993f8ef5d3641f69e557a79819ce0ba54762efb..739e1d1e6d239d06896daa131b692309cfeda843 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -34,7 +34,6 @@
#define DSIM_STOP_STATE_DAT(x) (((x) & 0xf) << 0)
#define DSIM_STOP_STATE_CLK BIT(8)
#define DSIM_TX_READY_HS_CLK BIT(10)
-#define DSIM_PLL_STABLE BIT(31)
/* DSIM_SWRST */
#define DSIM_FUNCRST BIT(16)
@@ -414,6 +413,7 @@ static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = {
.wait_for_reset = 1,
.num_bits_resol = 11,
.video_mode_bit = 25,
+ .pll_stable_bit = 31,
.esc_clken_bit = 28,
.byte_clken_bit = 24,
.tx_req_hsclk_bit = 31,
@@ -443,6 +443,7 @@ static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
.wait_for_reset = 1,
.num_bits_resol = 11,
.video_mode_bit = 25,
+ .pll_stable_bit = 31,
.esc_clken_bit = 28,
.byte_clken_bit = 24,
.tx_req_hsclk_bit = 31,
@@ -470,6 +471,7 @@ static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = {
.wait_for_reset = 1,
.num_bits_resol = 11,
.video_mode_bit = 25,
+ .pll_stable_bit = 31,
.esc_clken_bit = 28,
.byte_clken_bit = 24,
.tx_req_hsclk_bit = 31,
@@ -497,6 +499,7 @@ static const struct samsung_dsim_driver_data exynos5433_dsi_driver_data = {
.wait_for_reset = 0,
.num_bits_resol = 12,
.video_mode_bit = 25,
+ .pll_stable_bit = 31,
.esc_clken_bit = 28,
.byte_clken_bit = 24,
.tx_req_hsclk_bit = 31,
@@ -524,6 +527,7 @@ static const struct samsung_dsim_driver_data exynos5422_dsi_driver_data = {
.wait_for_reset = 1,
.num_bits_resol = 12,
.video_mode_bit = 25,
+ .pll_stable_bit = 31,
.esc_clken_bit = 28,
.byte_clken_bit = 24,
.tx_req_hsclk_bit = 31,
@@ -551,6 +555,7 @@ static const struct samsung_dsim_driver_data imx8mm_dsi_driver_data = {
.wait_for_reset = 0,
.num_bits_resol = 12,
.video_mode_bit = 25,
+ .pll_stable_bit = 31,
.esc_clken_bit = 28,
.byte_clken_bit = 24,
.tx_req_hsclk_bit = 31,
@@ -754,7 +759,7 @@ static unsigned long samsung_dsim_set_pll(struct samsung_dsim *dsi,
return 0;
}
reg = samsung_dsim_read(dsi, DSIM_LINK_STATUS_REG);
- } while ((reg & DSIM_PLL_STABLE) == 0);
+ } while ((reg & BIT(driver_data->pll_stable_bit)) == 0);
dsi->hs_clock = fout;
diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h
index def9b4c6ef28eede8175aaa84c495c5444d0f103..2dd63032d83ab5df0e1780a692789c340c2126dc 100644
--- a/include/drm/bridge/samsung-dsim.h
+++ b/include/drm/bridge/samsung-dsim.h
@@ -64,6 +64,7 @@ struct samsung_dsim_driver_data {
unsigned int wait_for_reset;
unsigned int num_bits_resol;
unsigned int video_mode_bit;
+ unsigned int pll_stable_bit;
unsigned int esc_clken_bit;
unsigned int byte_clken_bit;
unsigned int tx_req_hsclk_bit;
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 09/13] drm/bridge: samsung-dsim: increase timeout value for PLL_STABLE
2025-06-26 19:38 [PATCH v2 00/13] Support for Exynos7870 DSIM bridge Kaustabh Chakraborty
` (7 preceding siblings ...)
2025-06-26 19:38 ` [PATCH v2 08/13] drm/bridge: samsung-dsim: allow configuring the PLL_STABLE bit Kaustabh Chakraborty
@ 2025-06-26 19:38 ` Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 10/13] drm/bridge: samsung-dsim: add ability to define clock names for every variant Kaustabh Chakraborty
` (3 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Kaustabh Chakraborty @ 2025-06-26 19:38 UTC (permalink / raw)
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, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc, Kaustabh Chakraborty
Exynos7870's DSIM requires more time to stabilize its PLL. The current
timeout value, 1000, doesn't suffice. Increase the value to 3000, which
is just about enough as observed experimentally.
Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
---
drivers/gpu/drm/bridge/samsung-dsim.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index 739e1d1e6d239d06896daa131b692309cfeda843..5b96a5a1c78d212aca4e4fb057952927eb90f0d4 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -752,7 +752,7 @@ static unsigned long samsung_dsim_set_pll(struct samsung_dsim *dsi,
samsung_dsim_write(dsi, DSIM_PLLCTRL_REG, reg);
- timeout = 1000;
+ timeout = 3000;
do {
if (timeout-- == 0) {
dev_err(dsi->dev, "PLL failed to stabilize\n");
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 10/13] drm/bridge: samsung-dsim: add ability to define clock names for every variant
2025-06-26 19:38 [PATCH v2 00/13] Support for Exynos7870 DSIM bridge Kaustabh Chakraborty
` (8 preceding siblings ...)
2025-06-26 19:38 ` [PATCH v2 09/13] drm/bridge: samsung-dsim: increase timeout value for PLL_STABLE Kaustabh Chakraborty
@ 2025-06-26 19:38 ` Kaustabh Chakraborty
2025-06-26 19:39 ` [PATCH v2 11/13] dt-bindings: samsung,mipi-dsim: document exynos7870 DSIM compatible Kaustabh Chakraborty
` (2 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Kaustabh Chakraborty @ 2025-06-26 19:38 UTC (permalink / raw)
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, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc, Kaustabh Chakraborty
Presently, all devices refer to clock names from a single array. The
only controlling parameter is the number of clocks (num_clks field of
samsung_dsim_driver_data) which uses the first n clocks of that array.
As new devices are added, this approach turns out to be cumbersome.
Separate the clock names in individual arrays required by each variant,
in a struct clk_bulk_data. Add a pointer field to the driver data struct
which points to their respective clock names, and rework the clock usage
code to use the clk_bulk_* API instead.
Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
---
drivers/gpu/drm/bridge/samsung-dsim.c | 88 +++++++++++++++++------------------
include/drm/bridge/samsung-dsim.h | 2 +-
2 files changed, 44 insertions(+), 46 deletions(-)
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index 5b96a5a1c78d212aca4e4fb057952927eb90f0d4..6eddaa7e3ee6cb733d005169f5573eeba2a70f0a 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -218,23 +218,31 @@
#define DSI_XFER_TIMEOUT_MS 100
#define DSI_RX_FIFO_EMPTY 0x30800002
-#define OLD_SCLK_MIPI_CLK_NAME "pll_clk"
-
#define PS_TO_CYCLE(ps, hz) DIV64_U64_ROUND_CLOSEST(((ps) * (hz)), 1000000000000ULL)
-static const char *const clk_names[5] = {
- "bus_clk",
- "sclk_mipi",
- "phyclk_mipidphy0_bitclkdiv8",
- "phyclk_mipidphy0_rxclkesc0",
- "sclk_rgb_vclk_to_dsim0"
-};
-
enum samsung_dsim_transfer_type {
EXYNOS_DSI_TX,
EXYNOS_DSI_RX,
};
+static struct clk_bulk_data exynos3_clk_bulk_data[] = {
+ { .id = "bus_clk" },
+ { .id = "pll_clk" },
+};
+
+static struct clk_bulk_data exynos4_clk_bulk_data[] = {
+ { .id = "bus_clk" },
+ { .id = "sclk_mipi" },
+};
+
+static struct clk_bulk_data exynos5433_clk_bulk_data[] = {
+ { .id = "bus_clk" },
+ { .id = "sclk_mipi" },
+ { .id = "phyclk_mipidphy0_bitclkdiv8" },
+ { .id = "phyclk_mipidphy0_rxclkesc0" },
+ { .id = "sclk_rgb_vclk_to_dsim0" },
+};
+
enum reg_idx {
DSIM_LINK_STATUS_REG, /* Link status register */
DSIM_DPHY_STATUS_REG, /* D-PHY status register */
@@ -407,7 +415,8 @@ static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = {
.plltmr_reg = 0x50,
.has_freqband = 1,
.has_clklane_stop = 1,
- .num_clks = 2,
+ .clk_data = exynos3_clk_bulk_data,
+ .num_clks = ARRAY_SIZE(exynos3_clk_bulk_data),
.max_freq = 1000,
.wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
@@ -437,7 +446,8 @@ static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
.plltmr_reg = 0x50,
.has_freqband = 1,
.has_clklane_stop = 1,
- .num_clks = 2,
+ .clk_data = exynos4_clk_bulk_data,
+ .num_clks = ARRAY_SIZE(exynos4_clk_bulk_data),
.max_freq = 1000,
.wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
@@ -465,7 +475,8 @@ static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = {
.reg_ofs = exynos_reg_ofs,
.plltmr_reg = 0x58,
- .num_clks = 2,
+ .clk_data = exynos3_clk_bulk_data,
+ .num_clks = ARRAY_SIZE(exynos3_clk_bulk_data),
.max_freq = 1000,
.wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
@@ -493,7 +504,8 @@ static const struct samsung_dsim_driver_data exynos5433_dsi_driver_data = {
.reg_ofs = exynos5433_reg_ofs,
.plltmr_reg = 0xa0,
.has_clklane_stop = 1,
- .num_clks = 5,
+ .clk_data = exynos5433_clk_bulk_data,
+ .num_clks = ARRAY_SIZE(exynos5433_clk_bulk_data),
.max_freq = 1500,
.wait_for_hdr_fifo = 1,
.wait_for_reset = 0,
@@ -521,7 +533,8 @@ static const struct samsung_dsim_driver_data exynos5422_dsi_driver_data = {
.reg_ofs = exynos5433_reg_ofs,
.plltmr_reg = 0xa0,
.has_clklane_stop = 1,
- .num_clks = 2,
+ .clk_data = exynos3_clk_bulk_data,
+ .num_clks = ARRAY_SIZE(exynos3_clk_bulk_data),
.max_freq = 1500,
.wait_for_hdr_fifo = 1,
.wait_for_reset = 1,
@@ -549,7 +562,8 @@ static const struct samsung_dsim_driver_data imx8mm_dsi_driver_data = {
.reg_ofs = exynos5433_reg_ofs,
.plltmr_reg = 0xa0,
.has_clklane_stop = 1,
- .num_clks = 2,
+ .clk_data = exynos4_clk_bulk_data,
+ .num_clks = ARRAY_SIZE(exynos4_clk_bulk_data),
.max_freq = 2100,
.wait_for_hdr_fifo = 1,
.wait_for_reset = 0,
@@ -2023,7 +2037,7 @@ int samsung_dsim_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct samsung_dsim *dsi;
- int ret, i;
+ int ret;
dsi = devm_drm_bridge_alloc(dev, struct samsung_dsim, bridge, &samsung_dsim_bridge_funcs);
if (IS_ERR(dsi))
@@ -2047,23 +2061,11 @@ int samsung_dsim_probe(struct platform_device *pdev)
if (ret)
return dev_err_probe(dev, ret, "failed to get regulators\n");
- dsi->clks = devm_kcalloc(dev, dsi->driver_data->num_clks,
- sizeof(*dsi->clks), GFP_KERNEL);
- if (!dsi->clks)
- return -ENOMEM;
-
- for (i = 0; i < dsi->driver_data->num_clks; i++) {
- dsi->clks[i] = devm_clk_get(dev, clk_names[i]);
- if (IS_ERR(dsi->clks[i])) {
- if (strcmp(clk_names[i], "sclk_mipi") == 0) {
- dsi->clks[i] = devm_clk_get(dev, OLD_SCLK_MIPI_CLK_NAME);
- if (!IS_ERR(dsi->clks[i]))
- continue;
- }
-
- dev_info(dev, "failed to get the clock: %s\n", clk_names[i]);
- return PTR_ERR(dsi->clks[i]);
- }
+ ret = devm_clk_bulk_get(dev, dsi->driver_data->num_clks,
+ dsi->driver_data->clk_data);
+ if (ret) {
+ dev_err(dev, "failed to get clocks in bulk (%d)\n", ret);
+ return ret;
}
dsi->reg_base = devm_platform_ioremap_resource(pdev, 0);
@@ -2136,7 +2138,7 @@ static int samsung_dsim_suspend(struct device *dev)
{
struct samsung_dsim *dsi = dev_get_drvdata(dev);
const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
- int ret, i;
+ int ret;
usleep_range(10000, 20000);
@@ -2152,8 +2154,7 @@ static int samsung_dsim_suspend(struct device *dev)
phy_power_off(dsi->phy);
- for (i = driver_data->num_clks - 1; i > -1; i--)
- clk_disable_unprepare(dsi->clks[i]);
+ clk_bulk_disable_unprepare(driver_data->num_clks, driver_data->clk_data);
ret = regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies);
if (ret < 0)
@@ -2166,7 +2167,7 @@ static int samsung_dsim_resume(struct device *dev)
{
struct samsung_dsim *dsi = dev_get_drvdata(dev);
const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
- int ret, i;
+ int ret;
ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies);
if (ret < 0) {
@@ -2174,11 +2175,9 @@ static int samsung_dsim_resume(struct device *dev)
return ret;
}
- for (i = 0; i < driver_data->num_clks; i++) {
- ret = clk_prepare_enable(dsi->clks[i]);
- if (ret < 0)
- goto err_clk;
- }
+ ret = clk_bulk_prepare_enable(driver_data->num_clks, driver_data->clk_data);
+ if (ret < 0)
+ goto err_clk;
ret = phy_power_on(dsi->phy);
if (ret < 0) {
@@ -2189,8 +2188,7 @@ static int samsung_dsim_resume(struct device *dev)
return 0;
err_clk:
- while (--i > -1)
- clk_disable_unprepare(dsi->clks[i]);
+ clk_bulk_disable_unprepare(driver_data->num_clks, driver_data->clk_data);
regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies);
return ret;
diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h
index 2dd63032d83ab5df0e1780a692789c340c2126dc..ed05763b523ceab6956ed875baa9b460a3df5bbd 100644
--- a/include/drm/bridge/samsung-dsim.h
+++ b/include/drm/bridge/samsung-dsim.h
@@ -57,6 +57,7 @@ struct samsung_dsim_driver_data {
unsigned int has_clklane_stop:1;
unsigned int has_broken_fifoctrl_emptyhdr:1;
unsigned int has_sfrctrl:1;
+ struct clk_bulk_data *clk_data;
unsigned int num_clks;
unsigned int min_freq;
unsigned int max_freq;
@@ -103,7 +104,6 @@ struct samsung_dsim {
void __iomem *reg_base;
struct phy *phy;
- struct clk **clks;
struct clk *pll_clk;
struct regulator_bulk_data supplies[2];
int irq;
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 11/13] dt-bindings: samsung,mipi-dsim: document exynos7870 DSIM compatible
2025-06-26 19:38 [PATCH v2 00/13] Support for Exynos7870 DSIM bridge Kaustabh Chakraborty
` (9 preceding siblings ...)
2025-06-26 19:38 ` [PATCH v2 10/13] drm/bridge: samsung-dsim: add ability to define clock names for every variant Kaustabh Chakraborty
@ 2025-06-26 19:39 ` Kaustabh Chakraborty
2025-06-27 21:41 ` Rob Herring (Arm)
2025-06-26 19:39 ` [PATCH v2 12/13] drm/bridge: samsung-dsim: add driver support for exynos7870 DSIM bridge Kaustabh Chakraborty
2025-06-26 19:39 ` [PATCH v2 13/13] drm/exynos: dsi: add support for exynos7870 Kaustabh Chakraborty
12 siblings, 1 reply; 17+ messages in thread
From: Kaustabh Chakraborty @ 2025-06-26 19:39 UTC (permalink / raw)
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, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc, Kaustabh Chakraborty
Add compatible string for Exynos7870 DSIM bridge controller. The
device requires four clock sources, in schema they're named as "bus",
"pll", "byte", and "esc".
Suggested-by: Krzysztof Kozlowski <krzk@kernel.org>
Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
---
.../bindings/display/bridge/samsung,mipi-dsim.yaml | 27 ++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/Documentation/devicetree/bindings/display/bridge/samsung,mipi-dsim.yaml b/Documentation/devicetree/bindings/display/bridge/samsung,mipi-dsim.yaml
index 1acad99f396527192b6853f0096cfb8ae5669e6b..ad279f0993fa108b312126b112174f10f2b8c3d0 100644
--- a/Documentation/devicetree/bindings/display/bridge/samsung,mipi-dsim.yaml
+++ b/Documentation/devicetree/bindings/display/bridge/samsung,mipi-dsim.yaml
@@ -24,6 +24,7 @@ properties:
- samsung,exynos5410-mipi-dsi
- samsung,exynos5422-mipi-dsi
- samsung,exynos5433-mipi-dsi
+ - samsung,exynos7870-mipi-dsi
- fsl,imx8mm-mipi-dsim
- fsl,imx8mp-mipi-dsim
- items:
@@ -144,6 +145,32 @@ required:
allOf:
- $ref: ../dsi-controller.yaml#
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: samsung,exynos7870-mipi-dsi
+
+ then:
+ properties:
+ clocks:
+ minItems: 4
+ maxItems: 4
+
+ clock-names:
+ items:
+ - const: bus
+ - const: pll
+ - const: byte
+ - const: esc
+
+ ports:
+ required:
+ - port@0
+
+ required:
+ - ports
+
- if:
properties:
compatible:
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 12/13] drm/bridge: samsung-dsim: add driver support for exynos7870 DSIM bridge
2025-06-26 19:38 [PATCH v2 00/13] Support for Exynos7870 DSIM bridge Kaustabh Chakraborty
` (10 preceding siblings ...)
2025-06-26 19:39 ` [PATCH v2 11/13] dt-bindings: samsung,mipi-dsim: document exynos7870 DSIM compatible Kaustabh Chakraborty
@ 2025-06-26 19:39 ` Kaustabh Chakraborty
2025-06-26 19:39 ` [PATCH v2 13/13] drm/exynos: dsi: add support for exynos7870 Kaustabh Chakraborty
12 siblings, 0 replies; 17+ messages in thread
From: Kaustabh Chakraborty @ 2025-06-26 19:39 UTC (permalink / raw)
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, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc, Kaustabh Chakraborty
Add support for Exynos7870's DSIM IP block in the bridge driver.
Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
---
drivers/gpu/drm/bridge/samsung-dsim.c | 82 +++++++++++++++++++++++++++++++++++
include/drm/bridge/samsung-dsim.h | 1 +
2 files changed, 83 insertions(+)
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index 6eddaa7e3ee6cb733d005169f5573eeba2a70f0a..d3708643121a5c1a20548b89aa37ffb2952bc484 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -243,6 +243,13 @@ static struct clk_bulk_data exynos5433_clk_bulk_data[] = {
{ .id = "sclk_rgb_vclk_to_dsim0" },
};
+static struct clk_bulk_data exynos7870_clk_bulk_data[] = {
+ { .id = "bus" },
+ { .id = "pll" },
+ { .id = "byte" },
+ { .id = "esc" },
+};
+
enum reg_idx {
DSIM_LINK_STATUS_REG, /* Link status register */
DSIM_DPHY_STATUS_REG, /* D-PHY status register */
@@ -320,6 +327,32 @@ static const unsigned int exynos5433_reg_ofs[] = {
[DSIM_PHYTIMING2_REG] = 0xBC,
};
+static const unsigned int exynos7870_reg_ofs[] = {
+ [DSIM_LINK_STATUS_REG] = 0x04,
+ [DSIM_DPHY_STATUS_REG] = 0x08,
+ [DSIM_SWRST_REG] = 0x0C,
+ [DSIM_CLKCTRL_REG] = 0x10,
+ [DSIM_TIMEOUT_REG] = 0x14,
+ [DSIM_ESCMODE_REG] = 0x1C,
+ [DSIM_MDRESOL_REG] = 0x20,
+ [DSIM_MVPORCH_REG] = 0x24,
+ [DSIM_MHPORCH_REG] = 0x28,
+ [DSIM_MSYNC_REG] = 0x2C,
+ [DSIM_CONFIG_REG] = 0x30,
+ [DSIM_INTSRC_REG] = 0x34,
+ [DSIM_INTMSK_REG] = 0x38,
+ [DSIM_PKTHDR_REG] = 0x3C,
+ [DSIM_PAYLOAD_REG] = 0x40,
+ [DSIM_RXFIFO_REG] = 0x44,
+ [DSIM_SFRCTRL_REG] = 0x48,
+ [DSIM_FIFOCTRL_REG] = 0x4C,
+ [DSIM_PLLCTRL_REG] = 0x94,
+ [DSIM_PHYCTRL_REG] = 0xA4,
+ [DSIM_PHYTIMING_REG] = 0xB4,
+ [DSIM_PHYTIMING1_REG] = 0xB8,
+ [DSIM_PHYTIMING2_REG] = 0xBC,
+};
+
enum reg_value_idx {
RESET_TYPE,
PLL_TIMER,
@@ -392,6 +425,24 @@ static const unsigned int exynos5433_reg_values[] = {
[PHYTIMING_HS_TRAIL] = DSIM_PHYTIMING2_HS_TRAIL(0x0c),
};
+static const unsigned int exynos7870_reg_values[] = {
+ [RESET_TYPE] = DSIM_SWRST,
+ [PLL_TIMER] = 80000,
+ [STOP_STATE_CNT] = 0xa,
+ [PHYCTRL_ULPS_EXIT] = DSIM_PHYCTRL_ULPS_EXIT(0x177),
+ [PHYCTRL_VREG_LP] = 0,
+ [PHYCTRL_SLEW_UP] = 0,
+ [PHYTIMING_LPX] = DSIM_PHYTIMING_LPX(0x07),
+ [PHYTIMING_HS_EXIT] = DSIM_PHYTIMING_HS_EXIT(0x0c),
+ [PHYTIMING_CLK_PREPARE] = DSIM_PHYTIMING1_CLK_PREPARE(0x08),
+ [PHYTIMING_CLK_ZERO] = DSIM_PHYTIMING1_CLK_ZERO(0x2b),
+ [PHYTIMING_CLK_POST] = DSIM_PHYTIMING1_CLK_POST(0x0d),
+ [PHYTIMING_CLK_TRAIL] = DSIM_PHYTIMING1_CLK_TRAIL(0x09),
+ [PHYTIMING_HS_PREPARE] = DSIM_PHYTIMING2_HS_PREPARE(0x09),
+ [PHYTIMING_HS_ZERO] = DSIM_PHYTIMING2_HS_ZERO(0x0f),
+ [PHYTIMING_HS_TRAIL] = DSIM_PHYTIMING2_HS_TRAIL(0x0c),
+};
+
static const unsigned int imx8mm_dsim_reg_values[] = {
[RESET_TYPE] = DSIM_SWRST,
[PLL_TIMER] = 500,
@@ -558,6 +609,36 @@ static const struct samsung_dsim_driver_data exynos5422_dsi_driver_data = {
.min_freq = 500,
};
+static const struct samsung_dsim_driver_data exynos7870_dsi_driver_data = {
+ .reg_ofs = exynos7870_reg_ofs,
+ .plltmr_reg = 0xa0,
+ .has_clklane_stop = 1,
+ .has_sfrctrl = 1,
+ .clk_data = exynos7870_clk_bulk_data,
+ .num_clks = ARRAY_SIZE(exynos7870_clk_bulk_data),
+ .max_freq = 1500,
+ .wait_for_hdr_fifo = 0,
+ .wait_for_reset = 1,
+ .num_bits_resol = 12,
+ .video_mode_bit = 18,
+ .pll_stable_bit = 24,
+ .esc_clken_bit = 16,
+ .byte_clken_bit = 17,
+ .tx_req_hsclk_bit = 20,
+ .lane_esc_clk_bit = 8,
+ .lane_esc_data_offset = 9,
+ .pll_p_offset = 13,
+ .pll_m_offset = 3,
+ .pll_s_offset = 0,
+ .main_vsa_offset = 16,
+ .reg_values = exynos7870_reg_values,
+ .pll_fin_min = 6,
+ .pll_fin_max = 12,
+ .m_min = 41,
+ .m_max = 125,
+ .min_freq = 500,
+};
+
static const struct samsung_dsim_driver_data imx8mm_dsi_driver_data = {
.reg_ofs = exynos5433_reg_ofs,
.plltmr_reg = 0xa0,
@@ -598,6 +679,7 @@ samsung_dsim_types[DSIM_TYPE_COUNT] = {
[DSIM_TYPE_EXYNOS5410] = &exynos5_dsi_driver_data,
[DSIM_TYPE_EXYNOS5422] = &exynos5422_dsi_driver_data,
[DSIM_TYPE_EXYNOS5433] = &exynos5433_dsi_driver_data,
+ [DSIM_TYPE_EXYNOS7870] = &exynos7870_dsi_driver_data,
[DSIM_TYPE_IMX8MM] = &imx8mm_dsi_driver_data,
[DSIM_TYPE_IMX8MP] = &imx8mm_dsi_driver_data,
};
diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h
index ed05763b523ceab6956ed875baa9b460a3df5bbd..db4c3d3aef58a7de9f6cf44f2122b1b7e00e173d 100644
--- a/include/drm/bridge/samsung-dsim.h
+++ b/include/drm/bridge/samsung-dsim.h
@@ -29,6 +29,7 @@ enum samsung_dsim_type {
DSIM_TYPE_EXYNOS5410,
DSIM_TYPE_EXYNOS5422,
DSIM_TYPE_EXYNOS5433,
+ DSIM_TYPE_EXYNOS7870,
DSIM_TYPE_IMX8MM,
DSIM_TYPE_IMX8MP,
DSIM_TYPE_COUNT,
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 13/13] drm/exynos: dsi: add support for exynos7870
2025-06-26 19:38 [PATCH v2 00/13] Support for Exynos7870 DSIM bridge Kaustabh Chakraborty
` (11 preceding siblings ...)
2025-06-26 19:39 ` [PATCH v2 12/13] drm/bridge: samsung-dsim: add driver support for exynos7870 DSIM bridge Kaustabh Chakraborty
@ 2025-06-26 19:39 ` Kaustabh Chakraborty
12 siblings, 0 replies; 17+ messages in thread
From: Kaustabh Chakraborty @ 2025-06-26 19:39 UTC (permalink / raw)
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, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc, Kaustabh Chakraborty
Add glue layer support for Exynos7870's DSIM IP bridge driver.
Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
---
drivers/gpu/drm/exynos/exynos_drm_dsi.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
index 896a03639e2d9b80971d43aff540fc7fb9f005bd..c4d098ab7863890b2111742c07953c148304e4ec 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
@@ -154,6 +154,11 @@ static const struct samsung_dsim_plat_data exynos5433_dsi_pdata = {
.host_ops = &exynos_dsi_exynos_host_ops,
};
+static const struct samsung_dsim_plat_data exynos7870_dsi_pdata = {
+ .hw_type = DSIM_TYPE_EXYNOS7870,
+ .host_ops = &exynos_dsi_exynos_host_ops,
+};
+
static const struct of_device_id exynos_dsi_of_match[] = {
{
.compatible = "samsung,exynos3250-mipi-dsi",
@@ -175,6 +180,10 @@ static const struct of_device_id exynos_dsi_of_match[] = {
.compatible = "samsung,exynos5433-mipi-dsi",
.data = &exynos5433_dsi_pdata,
},
+ {
+ .compatible = "samsung,exynos7870-mipi-dsi",
+ .data = &exynos7870_dsi_pdata,
+ },
{ /* sentinel. */ }
};
MODULE_DEVICE_TABLE(of, exynos_dsi_of_match);
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 01/13] drm/bridge: samsung-dsim: separate LINK and DPHY status registers
2025-06-26 19:38 ` [PATCH v2 01/13] drm/bridge: samsung-dsim: separate LINK and DPHY status registers Kaustabh Chakraborty
@ 2025-06-27 10:07 ` Inki Dae
2025-06-27 12:29 ` Kaustabh Chakraborty
0 siblings, 1 reply; 17+ messages in thread
From: Inki Dae @ 2025-06-27 10:07 UTC (permalink / raw)
To: Kaustabh Chakraborty
Cc: 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,
dri-devel, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc
2025년 6월 27일 (금) 오전 4:42, Kaustabh Chakraborty <kauschluss@disroot.org>님이 작성:
>
> Exynos7870's DSIM has separate registers for LINK and DPHY status. This
> is in contrast to other devices in the driver which use a single
> register for both.
>
> Add their respective entries in the register list. Devices having a
> single status register have been assigned the same offset for both
> entries.
>
> Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
> ---
> drivers/gpu/drm/bridge/samsung-dsim.c | 15 +++++++++------
> 1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
> index f2f666b27d2d5ec016d7a7f47c87fcdf1377d41a..7fd4c34cdc3170d363942f98feec048097da3c06 100644
> --- a/drivers/gpu/drm/bridge/samsung-dsim.c
> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
> @@ -30,7 +30,7 @@
> /* returns true iff both arguments logically differs */
> #define NEQV(a, b) (!(a) ^ !(b))
>
> -/* DSIM_STATUS */
> +/* DSIM_DPHY_STATUS */
> #define DSIM_STOP_STATE_DAT(x) (((x) & 0xf) << 0)
> #define DSIM_STOP_STATE_CLK BIT(8)
> #define DSIM_TX_READY_HS_CLK BIT(10)
> @@ -239,7 +239,8 @@ enum samsung_dsim_transfer_type {
> };
>
> enum reg_idx {
> - DSIM_STATUS_REG, /* Status register */
According to the datasheets I have, both Exynos5422 and Exynos7420 use
DSIM_STATUS, while Exynos8890 splits this into DSIM_LINK_STATUS and
DSIM_PHY_STATUS. It appears that Exynos7870 follows the same approach
as Exynos8890.
The current modification removes the legacy DSIM_STATUS_REG and adds
new DSIM_LINK_STATUS_REG and DSIM_DPHY_STATUS_REG. However, this
change causes the register names used for older SoC versions to differ
from those in the datasheets, so I think it is better to keep the
legacy name for backward compatibility.
How about modifying it as follows?
enum reg_idx {
DSIM_STATUS_REG, /* Status register (legacy) */
DSIM_LINK_STATUS_REG, /* Link status register (Exynos7870, ...) */
DSIM_PHY_STATUS_REG, /* PHY status register (Exynos7870, ...) */
...
};
static const unsigned int exynos7870_reg_ofs[] = {
[DSIM_STATUS_REG] = 0x00, /* Legacy compatibility - use
LINK_STATUS */
[DSIM_LINK_STATUS_REG] = 0x04, /* Link status register */
[DSIM_PHY_STATUS_REG] = 0x08, /* PHY status register */
...
};
Additionally, by configuring the hw_type field in the
samsung_dsim_plat_data structure like you did with the patch[1], you
can use the appropriate register name for each SoC as shown below:
if (dsi->plat_data->hw_type == DSIM_TYPE_EXYNOS7870)
reg = samsung_dsim_read(dsi, DSIM_LINK_STATUS_REG);
else
reg = samsung_dsim_read(dsi, DSIM_STATUS_REG);
[1] [PATCH v2 12/13] drm/bridge: samsung-dsim: add driver support for
exynos7870 DSIM bridge
Thanks,
Inki Dae
> + DSIM_LINK_STATUS_REG, /* Link status register */
> + DSIM_DPHY_STATUS_REG, /* D-PHY status register */
> DSIM_SWRST_REG, /* Software reset register */
> DSIM_CLKCTRL_REG, /* Clock control register */
> DSIM_TIMEOUT_REG, /* Time out register */
> @@ -264,7 +265,8 @@ enum reg_idx {
> };
>
> static const unsigned int exynos_reg_ofs[] = {
> - [DSIM_STATUS_REG] = 0x00,
> + [DSIM_LINK_STATUS_REG] = 0x00,
> + [DSIM_DPHY_STATUS_REG] = 0x00,
> [DSIM_SWRST_REG] = 0x04,
> [DSIM_CLKCTRL_REG] = 0x08,
> [DSIM_TIMEOUT_REG] = 0x0c,
> @@ -288,7 +290,8 @@ static const unsigned int exynos_reg_ofs[] = {
> };
>
> static const unsigned int exynos5433_reg_ofs[] = {
> - [DSIM_STATUS_REG] = 0x04,
> + [DSIM_LINK_STATUS_REG] = 0x04,
> + [DSIM_DPHY_STATUS_REG] = 0x04,
> [DSIM_SWRST_REG] = 0x0C,
> [DSIM_CLKCTRL_REG] = 0x10,
> [DSIM_TIMEOUT_REG] = 0x14,
> @@ -690,7 +693,7 @@ static unsigned long samsung_dsim_set_pll(struct samsung_dsim *dsi,
> dev_err(dsi->dev, "PLL failed to stabilize\n");
> return 0;
> }
> - reg = samsung_dsim_read(dsi, DSIM_STATUS_REG);
> + reg = samsung_dsim_read(dsi, DSIM_LINK_STATUS_REG);
> } while ((reg & DSIM_PLL_STABLE) == 0);
>
> dsi->hs_clock = fout;
> @@ -966,7 +969,7 @@ static int samsung_dsim_init_link(struct samsung_dsim *dsi)
> return -EFAULT;
> }
>
> - reg = samsung_dsim_read(dsi, DSIM_STATUS_REG);
> + reg = samsung_dsim_read(dsi, DSIM_DPHY_STATUS_REG);
> if ((reg & DSIM_STOP_STATE_DAT(lanes_mask))
> != DSIM_STOP_STATE_DAT(lanes_mask))
> continue;
>
> --
> 2.49.0
>
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 01/13] drm/bridge: samsung-dsim: separate LINK and DPHY status registers
2025-06-27 10:07 ` Inki Dae
@ 2025-06-27 12:29 ` Kaustabh Chakraborty
0 siblings, 0 replies; 17+ messages in thread
From: Kaustabh Chakraborty @ 2025-06-27 12:29 UTC (permalink / raw)
To: Inki Dae
Cc: 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,
dri-devel, linux-kernel, devicetree, linux-arm-kernel,
linux-samsung-soc
On 2025-06-27 10:07, Inki Dae wrote:
> 2025년 6월 27일 (금) 오전 4:42, Kaustabh Chakraborty
> <kauschluss@disroot.org>님이 작성:
>>
>> Exynos7870's DSIM has separate registers for LINK and DPHY status.
>> This
>> is in contrast to other devices in the driver which use a single
>> register for both.
>>
>> Add their respective entries in the register list. Devices having a
>> single status register have been assigned the same offset for both
>> entries.
>>
>> Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
>> ---
>> drivers/gpu/drm/bridge/samsung-dsim.c | 15 +++++++++------
>> 1 file changed, 9 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c
>> b/drivers/gpu/drm/bridge/samsung-dsim.c
>> index
>> f2f666b27d2d5ec016d7a7f47c87fcdf1377d41a..7fd4c34cdc3170d363942f98feec048097da3c06
>> 100644
>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c
>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
>> @@ -30,7 +30,7 @@
>> /* returns true iff both arguments logically differs */
>> #define NEQV(a, b) (!(a) ^ !(b))
>>
>> -/* DSIM_STATUS */
>> +/* DSIM_DPHY_STATUS */
>> #define DSIM_STOP_STATE_DAT(x) (((x) & 0xf) << 0)
>> #define DSIM_STOP_STATE_CLK BIT(8)
>> #define DSIM_TX_READY_HS_CLK BIT(10)
>> @@ -239,7 +239,8 @@ enum samsung_dsim_transfer_type {
>> };
>>
>> enum reg_idx {
>> - DSIM_STATUS_REG, /* Status register */
>
> According to the datasheets I have, both Exynos5422 and Exynos7420 use
> DSIM_STATUS, while Exynos8890 splits this into DSIM_LINK_STATUS and
> DSIM_PHY_STATUS. It appears that Exynos7870 follows the same approach
> as Exynos8890.
>
> The current modification removes the legacy DSIM_STATUS_REG and adds
> new DSIM_LINK_STATUS_REG and DSIM_DPHY_STATUS_REG. However, this
> change causes the register names used for older SoC versions to differ
> from those in the datasheets, so I think it is better to keep the
> legacy name for backward compatibility.
>
> How about modifying it as follows?
> enum reg_idx {
> DSIM_STATUS_REG, /* Status register (legacy) */
> DSIM_LINK_STATUS_REG, /* Link status register (Exynos7870, ...)
> */
> DSIM_PHY_STATUS_REG, /* PHY status register (Exynos7870, ...)
> */
> ...
> };
>
> static const unsigned int exynos7870_reg_ofs[] = {
> [DSIM_STATUS_REG] = 0x00, /* Legacy compatibility - use
> LINK_STATUS */
> [DSIM_LINK_STATUS_REG] = 0x04, /* Link status register */
> [DSIM_PHY_STATUS_REG] = 0x08, /* PHY status register */
> ...
> };
>
> Additionally, by configuring the hw_type field in the
> samsung_dsim_plat_data structure like you did with the patch[1], you
> can use the appropriate register name for each SoC as shown below:
> if (dsi->plat_data->hw_type == DSIM_TYPE_EXYNOS7870)
I've instead added a flag to the driver data indicating the
availability of legacy status register. In my opinion, this
approach quickly turns cumbersome as the number of variants
increase.
Thanks for the suggestion.
> reg = samsung_dsim_read(dsi, DSIM_LINK_STATUS_REG);
> else
> reg = samsung_dsim_read(dsi, DSIM_STATUS_REG);
>
>
> [1] [PATCH v2 12/13] drm/bridge: samsung-dsim: add driver support for
> exynos7870 DSIM bridge
>
> Thanks,
> Inki Dae
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 11/13] dt-bindings: samsung,mipi-dsim: document exynos7870 DSIM compatible
2025-06-26 19:39 ` [PATCH v2 11/13] dt-bindings: samsung,mipi-dsim: document exynos7870 DSIM compatible Kaustabh Chakraborty
@ 2025-06-27 21:41 ` Rob Herring (Arm)
0 siblings, 0 replies; 17+ messages in thread
From: Rob Herring (Arm) @ 2025-06-27 21:41 UTC (permalink / raw)
To: Kaustabh Chakraborty
Cc: devicetree, Neil Armstrong, Seung-Woo Kim, Inki Dae,
Simona Vetter, Maxime Ripard, Alim Akhtar, Andrzej Hajda,
Robert Foss, Marek Szyprowski, Jonas Karlman, Thomas Zimmermann,
Jernej Skrabec, Krzysztof Kozlowski, linux-arm-kernel,
Conor Dooley, dri-devel, Krzysztof Kozlowski, Kyungmin Park,
Maarten Lankhorst, Jagan Teki, Laurent Pinchart,
linux-samsung-soc, linux-kernel, David Airlie
On Fri, 27 Jun 2025 01:09:00 +0530, Kaustabh Chakraborty wrote:
> Add compatible string for Exynos7870 DSIM bridge controller. The
> device requires four clock sources, in schema they're named as "bus",
> "pll", "byte", and "esc".
>
> Suggested-by: Krzysztof Kozlowski <krzk@kernel.org>
> Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
> ---
> .../bindings/display/bridge/samsung,mipi-dsim.yaml | 27 ++++++++++++++++++++++
> 1 file changed, 27 insertions(+)
>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2025-06-27 21:41 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-26 19:38 [PATCH v2 00/13] Support for Exynos7870 DSIM bridge Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 01/13] drm/bridge: samsung-dsim: separate LINK and DPHY status registers Kaustabh Chakraborty
2025-06-27 10:07 ` Inki Dae
2025-06-27 12:29 ` Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 02/13] drm/bridge: samsung-dsim: add SFRCTRL register Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 03/13] drm/bridge: samsung-dsim: add flag to control header FIFO wait Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 04/13] drm/bridge: samsung-dsim: allow configuring bits and offsets of CLKCTRL register Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 05/13] drm/bridge: samsung-dsim: allow configuring the MAIN_VSA offset Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 06/13] drm/bridge: samsung-dsim: allow configuring the VIDEO_MODE bit Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 07/13] drm/bridge: samsung-dsim: allow configuring PLL_M and PLL_S offsets Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 08/13] drm/bridge: samsung-dsim: allow configuring the PLL_STABLE bit Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 09/13] drm/bridge: samsung-dsim: increase timeout value for PLL_STABLE Kaustabh Chakraborty
2025-06-26 19:38 ` [PATCH v2 10/13] drm/bridge: samsung-dsim: add ability to define clock names for every variant Kaustabh Chakraborty
2025-06-26 19:39 ` [PATCH v2 11/13] dt-bindings: samsung,mipi-dsim: document exynos7870 DSIM compatible Kaustabh Chakraborty
2025-06-27 21:41 ` Rob Herring (Arm)
2025-06-26 19:39 ` [PATCH v2 12/13] drm/bridge: samsung-dsim: add driver support for exynos7870 DSIM bridge Kaustabh Chakraborty
2025-06-26 19:39 ` [PATCH v2 13/13] drm/exynos: dsi: add support for exynos7870 Kaustabh Chakraborty
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).