Skip to contentSkip to conversation

drm/panel: ilitek-ili9488: add the PocketGo S30 panel

PATCH In review Romain TISSERAND 3 participants 10 messages Nov 9 – Nov 11

Subsystems (5)
lore
Share & tools
lore
#0 lore raw

v2 cover drm/panel: ilitek-ili9488: add the PocketGo S30 panel

The Miyoo PocketGo S30 is an Allwinner A33 handheld with a 320x480 1-lane MIPI-DSI panel built around an Ilitek ILI9488. The panel uses the existing ILI9488 DSI driver with its own init sequence (from the stock kernel), timings and DSI mode; the sequence is close to the E35GH-I-MW800CB one.

Patch 1 makes the binding's port optional: the Allwinner sun6i DSI host links its panel as a child node and has no output port, and the driver does not use one. Patch 2 adds the compatible, patch 3 the panel. The board devicetree will be sent to the sunxi tree separately.

Testing: each patch built with W=1 for arm (multi_v7_defconfig, DRM_PANEL_ILITEK_ILI9488=y and =m) and arm64 (defconfig, =m), no warnings; dt_binding_check clean for ilitek,ili9488.yaml. Tested on a PocketGo S30 on 7.3.1 with v1 (A33 sun6i DSI, one lane): the panel probes and attaches to the DSI host, and the picture shows the right colors, size and position. v2 only renames the compatible and edits a commit message.

Changes in v2:
- Drop the "pocketgo" vendor prefix patch: PocketGo is a product line,
not a company (Krzysztof). The S30 is made by Bittboy/Miyoo, so use
the existing "miyoo" prefix: "miyoo,pocketgo-s30-panel".
- 3/3: drop the claim that COLMOD sets the panel to 6 bits per color
over DSI, only say the stock value is kept (Igor).
- Add Igor's Reviewed-by. I kept it on 2/3 and 3/3 although their
compatible changed from "pocketgo,s30-panel" to
"miyoo,pocketgo-s30-panel"; nothing else changed in them.
- Link to v1: https://lore.kernel.org/all/[email protected]/

Tool disclosure: this series was prepared with Claude Opus 5.5 (Anthropic) as a coding assistant, in an interactive session: it extracted the stock init table and timings, wrote the code, the bindings and the messages. I reviewed and understand it, and tested it as described.

Romain TISSERAND (3):
dt-bindings: display: panel: ilitek,ili9488: make the port optional
dt-bindings: display: panel: ilitek,ili9488: add the PocketGo S30
panel
drm/panel: ilitek-ili9488: add the PocketGo S30 panel

 .../display/panel/ilitek,ili9488.yaml         |  2 +-
 drivers/gpu/drm/panel/panel-ilitek-ili9488.c  | 55 +++++++++++++++++++
 2 files changed, 56 insertions(+), 1 deletion(-)

base-commit: a1e63ab695ad76850ab9787b9eb6aab695dc2965

Signature · 1 line
2.43.0
#1 lore raw

PATCH v2 1/3 dt-bindings: display: panel: ilitek,ili9488: make the port optional

The panel is a MIPI-DSI peripheral, a child node of its DSI host, and the driver does not use a graph port. A port is only needed when the host links its panel through the graph; other DSI hosts, such as the Allwinner sun6i-a31-mipi-dsi one, link the child node and have no output port to point at. The PinePhone panel is described that way on the same host, without a port.

Keep the port allowed (panel-common) but no longer required, as for other DSI panels such as ilitek,ili9881c.

---
 .../devicetree/bindings/display/panel/ilitek,ili9488.yaml        | 1 -
 1 file changed, 1 deletion(-)
Documentation/devicetree/bindings/display/panel/ilitek,ili9488.yaml +0 -1
index ea7449273022..016a573893b7 100644
@@ -32,7 +32,6 @@ required:
   - iovcc-supply
   - reset-gpios
   - backlight
-  - port
 
 unevaluatedProperties: false
 
Signature · 1 line
2.43.0
Reviewed-by on v2 1/3
#2 lore raw

Re: [PATCH v2 1/3] dt-bindings: display: panel: ilitek,ili9488: make the port optional

Quoted 9 lines · Romain TISSERAND

The panel is a MIPI-DSI peripheral, a child node of its DSI host, and the driver does not use a graph port. A port is only needed when the host links its panel through the graph; other DSI hosts, such as the Allwinner sun6i-a31-mipi-dsi one, link the child node and have no output port to point at. The PinePhone panel is described that way on the same host, without a port.

Keep the port allowed (panel-common) but no longer required, as for other DSI panels such as ilitek,ili9881c.

ilitek,ili7807s and a few others have the same and it is confusing. The port should be required when this is connected over SPI or I2C, but not for MIPI DSI. I think that for MIPI DSI port is meaningless so actually incorrect.

Why was it added in the first place?

Quoted 6 lines
---
 .../devicetree/bindings/display/panel/ilitek,ili9488.yaml        | 1 -
 1 file changed, 1 deletion(-)

Best regards,
Krzysztof

#3 lore raw

Re: [PATCH v2 1/3] dt-bindings: display: panel: ilitek,ili9488: make the port optional

Quoted 11 lines · Krzysztof Kozlowski
Quoted 9 lines · Romain TISSERAND

The panel is a MIPI-DSI peripheral, a child node of its DSI host, and the driver does not use a graph port. A port is only needed when the host links its panel through the graph; other DSI hosts, such as the Allwinner sun6i-a31-mipi-dsi one, link the child node and have no output port to point at. The PinePhone panel is described that way on the same host, without a port.

Keep the port allowed (panel-common) but no longer required, as for other DSI panels such as ilitek,ili9881c.

Quoted 7 lines

ilitek,ili7807s and a few others have the same and it is confusing. The port should be required when this is connected over SPI or I2C, but not for MIPI DSI. I think that for MIPI DSI port is meaningless so actually incorrect.

Why was it added in the first place?

However won't all DRM drivers actually require panel? see b089c0a9b14c and 169466d4e59c which removed fallback to the child node.

Best regards,
Krzysztof

#4 lore raw

Re: [PATCH v2 1/3] dt-bindings: display: panel: ilitek, ili9488: make the port optional

In reply to Krzysztof Kozlowski
Quoted 17 lines · 在 2026-11-10二的 13:00 +0100,Krzysztof Kozlowski写道:
Quoted 12 lines · Romain TISSERAND

The panel is a MIPI-DSI peripheral, a child node of its DSI host, and the
driver does not use a graph port. A port is only needed when the host
links its panel through the graph; other DSI hosts, such as the Allwinner
sun6i-a31-mipi-dsi one, link the child node and have no output port to
point at. The PinePhone panel is described that way on the same host,
without a port.

Quoted 3 lines

Keep the port allowed (panel-common) but no longer required, as for other
DSI panels such as ilitek,ili9881c.

Quoted 7 lines

ilitek,ili7807s and a few others have the same and it is confusing. The
port should be required when this is connected over SPI or I2C, but not
for MIPI DSI. I think that for MIPI DSI port is meaningless so actually
incorrect.

I found that the dw-mipi-dsi common code (e.g. on Rockchip SoCs with dw_mipi_dsi-rockchip) would expect the panel to be connected via a port even if it's the child node of the DSI controller.

Such an example is at arch/arm64/boot/dts/rockchip/rk3399-pinephone- pro.dts .

Thanks,
Icenowy

Quoted 16 lines

Why was it added in the first place?

Quoted 7 lines

---
 .../devicetree/bindings/display/panel/ilitek,ili9488.yaml        | 1 -

 1 file changed, 1 deletion(-)

Reviewed-by: Krzysztof Kozlowski
<[email protected]>

Best regards,
Krzysztof

#5 lore raw

Re: [PATCH v2 1/3] dt-bindings: display: panel: ilitek, ili9488: make the port optional

Quoted 26 lines · Icenowy Zheng
Quoted 17 lines · 在 2026-11-10二的 13:00 +0100,Krzysztof Kozlowski写道:
Quoted 12 lines · Romain TISSERAND

The panel is a MIPI-DSI peripheral, a child node of its DSI host, and the
driver does not use a graph port. A port is only needed when the host
links its panel through the graph; other DSI hosts, such as the Allwinner
sun6i-a31-mipi-dsi one, link the child node and have no output port to
point at. The PinePhone panel is described that way on the same host,
without a port.

Quoted 3 lines

Keep the port allowed (panel-common) but no longer required, as for other
DSI panels such as ilitek,ili9881c.

Quoted 7 lines

ilitek,ili7807s and a few others have the same and it is confusing. The
port should be required when this is connected over SPI or I2C, but not
for MIPI DSI. I think that for MIPI DSI port is meaningless so actually
incorrect.

Quoted 7 lines

I found that the dw-mipi-dsi common code (e.g. on Rockchip SoCs with dw_mipi_dsi-rockchip) would expect the panel to be connected via a port even if it's the child node of the DSI controller.

Such an example is at arch/arm64/boot/dts/rockchip/rk3399-pinephone- pro.dts .

Yes, the same for Qualcomm. So I actually wonder who needs the change here.

Best regards,
Krzysztof

#6 lore raw

Re: [PATCH v2 1/3] dt-bindings: display: panel: ilitek, ili9488: make the port optional

Quoted 39 lines · 在 2026-11-11三的 11:28 +0100,Krzysztof Kozlowski写道:
Quoted 38 lines · Icenowy Zheng
Quoted 21 lines · 在 2026-11-10二的 13:00 +0100,Krzysztof Kozlowski写道:
Quoted 15 lines · Romain TISSERAND

The panel is a MIPI-DSI peripheral, a child node of its DSI host,
and the
driver does not use a graph port. A port is only needed when the
host
links its panel through the graph; other DSI hosts, such as the Allwinner
sun6i-a31-mipi-dsi one, link the child node and have no output port
to
point at. The PinePhone panel is described that way on the same host,
without a port.

Quoted 4 lines

Keep the port allowed (panel-common) but no longer required, as for
other
DSI panels such as ilitek,ili9881c.

Quoted 9 lines

ilitek,ili7807s and a few others have the same and it is confusing.
The
port should be required when this is connected over SPI or I2C, but
not
for MIPI DSI. I think that for MIPI DSI port is meaningless so actually
incorrect.

I found that the dw-mipi-dsi common code (e.g. on Rockchip SoCs with
dw_mipi_dsi-rockchip) would expect the panel to be connected via a port
even if it's the child node of the DSI controller.

Quoted 7 lines
Quoted 4 lines

Such an example is at arch/arm64/boot/dts/rockchip/rk3399- pinephone-
pro.dts .

Yes, the same for Qualcomm. So I actually wonder who needs the change here.

I wonder too because I just created a MIPI DSI driver based on the dw- mipi-dsi common code.

I think the different requirement between sun6i-mipi-dsi and dw-mipi- dsi is exposing the implementation details of the corresponding drivers. Maybe this should be eliminated, but this would be some big work.

Thanks,
Icenowy

Quoted 3 lines

Best regards,
Krzysztof

#7 lore raw

PATCH v2 2/3 dt-bindings: display: panel: ilitek,ili9488: add the PocketGo S30 panel

In reply to Romain TISSERAND

The Miyoo PocketGo S30 handheld has a 320x480 1-lane MIPI-DSI panel built around an Ilitek ILI9488.

---
 .../devicetree/bindings/display/panel/ilitek,ili9488.yaml        | 1 +
 1 file changed, 1 insertion(+)
Documentation/devicetree/bindings/display/panel/ilitek,ili9488.yaml +1 -0
index 016a573893b7..2908808393aa 100644
@@ -17,6 +17,7 @@ properties:
     items:
       - enum:
           - focuslcds,e35gh-i-mw800cb
+          - miyoo,pocketgo-s30-panel
       - const: ilitek,ili9488
 
   reg:
Signature · 1 line
2.43.0
Acked-by on v2 2/3
#8 lore raw

Re: [PATCH v2 2/3] dt-bindings: display: panel: ilitek,ili9488: add the PocketGo S30 panel

Quoted 8 lines · Romain TISSERAND

The Miyoo PocketGo S30 handheld has a 320x480 1-lane MIPI-DSI panel built around an Ilitek ILI9488.

---
 .../devicetree/bindings/display/panel/ilitek,ili9488.yaml        | 1 +
 1 file changed, 1 insertion(+)

Best regards,
Krzysztof

#9 lore raw

PATCH v2 3/3 drm/panel: ilitek-ili9488: add the PocketGo S30 panel

In reply to Romain TISSERAND

The Miyoo PocketGo S30 handheld (Allwinner A33) has a 320x480 1-lane MIPI-DSI panel built around an Ilitek ILI9488.

The init sequence is the stock kernel's, read back from the running stock system. It differs from the E35GH-I-MW800CB sequence only in VCOM (0x26 instead of 0x25), the display function control (2 parameters instead of 3) and the position of the inversion command. The interface pixel format (COLMOD) is kept at the stock value.

Timings and video mode are from the stock configuration: 12 MHz pixel clock, htotal 382, vtotal 524, active low sync (lcd_hv_sync_polarity 0), non-burst video mode with sync pulses and without EoT packets.

---
 drivers/gpu/drm/panel/panel-ilitek-ili9488.c | 55 ++++++++++++++++++++
 1 file changed, 55 insertions(+)
drivers/gpu/drm/panel/panel-ilitek-ili9488.c +55 -0
index 6ab8ae72abbf..29b869a6e909 100644
@@ -86,6 +86,50 @@ static const struct drm_display_mode e35gh_i_mw800cb_display_mode = {
 	.type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
 };
 
+static void pocketgo_s30_init(struct mipi_dsi_multi_context *ctx)
+{
+	/* Gamma control 1,2 */
+	mipi_dsi_dcs_write_seq_multi(ctx, 0xE0, 0x00, 0x10, 0x14, 0x01, 0x0E, 0x04, 0x33,
+				     0x56, 0x48, 0x03, 0x0C, 0x0B, 0x2B, 0x34, 0x0F);
+	mipi_dsi_dcs_write_seq_multi(ctx, 0xE1, 0x00, 0x12, 0x18, 0x05, 0x12, 0x06, 0x40,
+				     0x34, 0x57, 0x06, 0x10, 0x0C, 0x3B, 0x3F, 0x0F);
+	/* Power control 1,2 */
+	mipi_dsi_dcs_write_seq_multi(ctx, 0xC0, 0x0F, 0x0C);
+	mipi_dsi_dcs_write_seq_multi(ctx, 0xC1, 0x41);
+	/* VCOM Control */
+	mipi_dsi_dcs_write_seq_multi(ctx, 0xC5, 0x00, 0x26, 0x80);
+	mipi_dsi_dcs_write_seq_multi(ctx, 0x36, 0x48);
+	/* Interface pixel format 18bpp */
+	mipi_dsi_dcs_write_seq_multi(ctx, 0x3A, 0x66);
+	mipi_dsi_dcs_write_seq_multi(ctx, 0xB0, 0x00);
+	mipi_dsi_dcs_write_seq_multi(ctx, 0xB1, 0xA0);
+	mipi_dsi_dcs_write_seq_multi(ctx, 0xB4, 0x02);
+	mipi_dsi_dcs_write_seq_multi(ctx, 0xB6, 0x02, 0x02);
+	mipi_dsi_dcs_write_seq_multi(ctx, 0xE9, 0x00);
+	mipi_dsi_dcs_write_seq_multi(ctx, 0x21);
+	mipi_dsi_dcs_write_seq_multi(ctx, 0xF7, 0xA9, 0x51, 0x2C, 0x82);
+}
+
+static const struct drm_display_mode pocketgo_s30_display_mode = {
+	.clock = 12000,
+
+	.hdisplay = 320,
+	.hsync_start = 320 + 22,
+	.hsync_end = 320 + 22 + 12,
+	.htotal = 320 + 22 + 12 + 28,
+
+	.vdisplay = 480,
+	.vsync_start = 480 + 22,
+	.vsync_end = 480 + 22 + 4,
+	.vtotal = 480 + 22 + 4 + 18,
+
+	.width_mm = 49,
+	.height_mm = 74,
+
+	.flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
+	.type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
+};
+
 static inline struct ili9488 *panel_to_ili9488(struct drm_panel *panel)
 {
 	return container_of(panel, struct ili9488, panel);
@@ -269,8 +313,19 @@ static const struct ili9488_desc e35gh_i_mw800cb_desc = {
 	.bpc = 6,
 };
 
+static const struct ili9488_desc pocketgo_s30_desc = {
+	.init_sequence = pocketgo_s30_init,
+	.display_mode = &pocketgo_s30_display_mode,
+	.mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
+		      MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_NO_EOT_PACKET,
+	.format = MIPI_DSI_FMT_RGB888,
+	.lanes = 1,
+	.bpc = 6,
+};
+
 static const struct of_device_id ili9488_of_match[] = {
 	{ .compatible = "focuslcds,e35gh-i-mw800cb", .data = &e35gh_i_mw800cb_desc },
+	{ .compatible = "miyoo,pocketgo-s30-panel", .data = &pocketgo_s30_desc },
 	{ }
 };
 
Signature · 1 line
2.43.0