Re: [PATCH v5 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 04/07/2024 09:29, 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>
---
  .../drm/panel/panel-boe-th101mb31ig002-28a.c  | 40 +++++++++++++++----
  1 file changed, 33 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..159e401ad0e6 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;
+	const struct panel_init_cmd *init_cmds;
+	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(ctx);
+	if (ret)
+		return ret;

There's no ->init in struct panel_desc

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_cmds = 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);

use device_get_match_data() instead, and check the return

+	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,9 @@ 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
+	},

Weird indentation, please use :
	{
		.compatible = ..,
		.data = ...,
	},

  	{ /* sentinel */ }
  };
  MODULE_DEVICE_TABLE(of, boe_th101mb31ig002_of_match);

Thanks,
Neil




[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux