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 <lvzhaoxi...@huaqin.corp-partner.google.com>
---
  .../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

Reply via email to