Re: [PATCH v6 1/5] drm/panel: boe-th101mb31ig002 : Make it compatible with other panel.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 09/07/2024 15:47, Zhaoxiong Lv wrote:
This driver currently only applies to one panel. Modify it to be
compatible with other panels.

Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
---
Changes between V6 and V5:
-  1. Corrected the use of "->init" in struct panel_desc,
-  2. Modify indentation in "boe_th101mb31ig002_of_match[]"
v5: https://lore.kernel.org/all/20240704072958.27876-2-lvzhaoxiong@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/
---
  .../drm/panel/panel-boe-th101mb31ig002-28a.c  | 41 +++++++++++++++----
  1 file changed, 34 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/panel/panel-boe-th101mb31ig002-28a.c b/drivers/gpu/drm/panel/panel-boe-th101mb31ig002-28a.c
index 763e9f8342d3..8f03920e3503 100644
--- a/drivers/gpu/drm/panel/panel-boe-th101mb31ig002-28a.c
+++ b/drivers/gpu/drm/panel/panel-boe-th101mb31ig002-28a.c
@@ -17,11 +17,21 @@
  #include <drm/drm_modes.h>
  #include <drm/drm_panel.h>
+struct panel_desc {
+	const struct drm_display_mode *modes;
+	unsigned long mode_flags;
+	enum mipi_dsi_pixel_format format;
+	int (*init)(struct drm_panel *panel);
+	unsigned int lanes;
+};
+
  struct boe_th101mb31ig002 {
  	struct drm_panel panel;
struct mipi_dsi_device *dsi; + const struct panel_desc *desc;
+
  	struct regulator *power;
  	struct gpio_desc *enable;
  	struct gpio_desc *reset;
@@ -161,7 +171,10 @@ static int boe_th101mb31ig002_prepare(struct drm_panel *panel)
  	gpiod_set_value_cansleep(ctx->enable, 1);
  	msleep(50);
  	boe_th101mb31ig002_reset(ctx);
-	boe_th101mb31ig002_enable(panel);
+
+	ret = ctx->desc->init(panel);
+	if (ret)
+		return ret;
return 0;
  }
@@ -181,6 +194,16 @@ static const struct drm_display_mode boe_th101mb31ig002_default_mode = {
  	.type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
  };
+static const struct panel_desc boe_th101mb31ig002_desc = {
+	.modes = &boe_th101mb31ig002_default_mode,
+	.lanes = 4,
+	.format = MIPI_DSI_FMT_RGB888,
+	.mode_flags = MIPI_DSI_MODE_VIDEO_BURST |
+			  MIPI_DSI_MODE_NO_EOT_PACKET |
+			  MIPI_DSI_MODE_LPM,
+	.init = boe_th101mb31ig002_enable,
+};
+
  static int boe_th101mb31ig002_get_modes(struct drm_panel *panel,
  					struct drm_connector *connector)
  {
@@ -237,6 +260,7 @@ static const struct drm_panel_funcs boe_th101mb31ig002_funcs = {
  static int boe_th101mb31ig002_dsi_probe(struct mipi_dsi_device *dsi)
  {
  	struct boe_th101mb31ig002 *ctx;
+	const struct panel_desc *desc;
  	int ret;
ctx = devm_kzalloc(&dsi->dev, sizeof(*ctx), GFP_KERNEL);
@@ -246,11 +270,11 @@ static int boe_th101mb31ig002_dsi_probe(struct mipi_dsi_device *dsi)
  	mipi_dsi_set_drvdata(dsi, ctx);
  	ctx->dsi = dsi;
- dsi->lanes = 4;
-	dsi->format = MIPI_DSI_FMT_RGB888;
-	dsi->mode_flags = MIPI_DSI_MODE_VIDEO_BURST |
-			  MIPI_DSI_MODE_NO_EOT_PACKET |
-			  MIPI_DSI_MODE_LPM;
+	desc = of_device_get_match_data(&dsi->dev);
+	dsi->lanes = desc->lanes;
+	dsi->format = desc->format;
+	dsi->mode_flags = desc->mode_flags;
+	ctx->desc = desc;
ctx->power = devm_regulator_get(&dsi->dev, "power");
  	if (IS_ERR(ctx->power))
@@ -302,7 +326,10 @@ static void boe_th101mb31ig002_dsi_remove(struct mipi_dsi_device *dsi)
  }
static const struct of_device_id boe_th101mb31ig002_of_match[] = {
-	{ .compatible = "boe,th101mb31ig002-28a", },
+	{
+		.compatible = "boe,th101mb31ig002-28a",
+		.data = &boe_th101mb31ig002_desc
+	},
  	{ /* sentinel */ }
  };
  MODULE_DEVICE_TABLE(of, boe_th101mb31ig002_of_match);

Reviewed-by: Neil Armstrong <neil.armstrong@xxxxxxxxxx>



[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux