Re: [PATCH v5 17/29] drm/panel: panel-dsi-cm: add panel database to driver

2020-12-14 Thread Sebastian Reichel
On Tue, Dec 08, 2020 at 02:28:43PM +0200, Tomi Valkeinen wrote:
> Add a panel database to the driver instead of reading propertes from DT
> data. This is similar to panel-simple, and I believe it's more future
> safe way to handle the panels.
> 
> Signed-off-by: Tomi Valkeinen 
> Reviewed-by: Sam Ravnborg 
> ---
>  drivers/gpu/drm/panel/panel-dsi-cm.c | 107 +--
>  1 file changed, 69 insertions(+), 38 deletions(-)
> 
> diff --git a/drivers/gpu/drm/panel/panel-dsi-cm.c 
> b/drivers/gpu/drm/panel/panel-dsi-cm.c
> index fa564aad7f25..3fb5b2856283 100644
> --- a/drivers/gpu/drm/panel/panel-dsi-cm.c
> +++ b/drivers/gpu/drm/panel/panel-dsi-cm.c
> @@ -21,10 +21,7 @@
>  #include 
>  #include 
>  
> -#include 
>  #include 
> -#include 
> -#include 
>  
>  #define DCS_GET_ID1  0xda
>  #define DCS_GET_ID2  0xdb
> @@ -32,6 +29,18 @@
>  
>  #define DCS_REGULATOR_SUPPLY_NUM 2
>  
> +static const struct of_device_id dsicm_of_match[];
> +
> +struct dsic_panel_data {
> + u32 xres;
> + u32 yres;
> + u32 refresh;
> + u32 width_mm;
> + u32 height_mm;
> + u32 max_hs_rate;
> + u32 max_lp_rate;
> +};
> +
>  struct panel_drv_data {
>   struct mipi_dsi_device *dsi;
>   struct drm_panel panel;
> @@ -47,16 +56,14 @@ struct panel_drv_data {
>*/
>   unsigned long   hw_guard_wait;  /* max guard time in jiffies */
>  
> - /* panel HW configuration from DT or platform data */
> + const struct dsic_panel_data *panel_data;
> +
>   struct gpio_desc *reset_gpio;
>  
>   struct regulator_bulk_data supplies[DCS_REGULATOR_SUPPLY_NUM];
>  
>   bool use_dsi_backlight;
>  
> - int width_mm;
> - int height_mm;
> -
>   /* runtime variables */
>   bool enabled;
>  
> @@ -450,11 +457,8 @@ static int dsicm_get_modes(struct drm_panel *panel,
>   return -ENOMEM;
>   }
>  
> - drm_mode_set_name(mode);
> - mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
> -
> - connector->display_info.width_mm = ddata->width_mm;
> - connector->display_info.height_mm = ddata->height_mm;
> + connector->display_info.width_mm = ddata->panel_data->width_mm;
> + connector->display_info.height_mm = ddata->panel_data->height_mm;
>  
>   drm_mode_probed_add(connector, mode);
>  
> @@ -471,15 +475,10 @@ static const struct drm_panel_funcs dsicm_panel_funcs = 
> {
>  
>  static int dsicm_probe_of(struct mipi_dsi_device *dsi)
>  {
> - struct device_node *node = dsi->dev.of_node;
>   struct backlight_device *backlight;
>   struct panel_drv_data *ddata = mipi_dsi_get_drvdata(dsi);
> - struct display_timing timing;
> - struct videomode vm = {
> - .hactive = 864,
> - .vactive = 480,
> - };
>   int err;
> + struct drm_display_mode *mode = >mode;
>  
>   ddata->reset_gpio = devm_gpiod_get(>dev, "reset", GPIOD_OUT_LOW);
>   if (IS_ERR(ddata->reset_gpio)) {
> @@ -488,23 +487,16 @@ static int dsicm_probe_of(struct mipi_dsi_device *dsi)
>   return err;
>   }
>  
> - err = of_get_display_timing(node, "panel-timing", );
> - if (!err) {
> - videomode_from_timing(, );
> - } else {
> - dev_warn(>dev,
> -  "failed to get video timing, using defaults\n");
> - }
> -
> - if (!vm.pixelclock)
> - vm.pixelclock = vm.hactive * vm.vactive * 60;
> - drm_display_mode_from_videomode(, >mode);
> -
> - ddata->width_mm = 0;
> - of_property_read_u32(node, "width-mm", >width_mm);
> -
> - ddata->height_mm = 0;
> - of_property_read_u32(node, "height-mm", >height_mm);
> + mode->hdisplay = mode->hsync_start = mode->hsync_end = mode->htotal =
> + ddata->panel_data->xres;
> + mode->vdisplay = mode->vsync_start = mode->vsync_end = mode->vtotal =
> + ddata->panel_data->yres;
> + mode->clock = ddata->panel_data->xres * ddata->panel_data->yres *
> + ddata->panel_data->refresh / 1000;
> + mode->width_mm = ddata->panel_data->width_mm;
> + mode->height_mm = ddata->panel_data->height_mm;
> + mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
> + drm_mode_set_name(mode);
>  
>   ddata->supplies[0].supply = "vpnl";
>   ddata->supplies[1].supply = "vddi";
> @@ -531,6 +523,7 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
>   struct panel_drv_data *ddata;
>   struct backlight_device *bldev = NULL;
>   struct device *dev = >dev;
> + const struct of_device_id *id;
>   int r;
>  
>   dev_dbg(dev, "probe\n");
> @@ -542,6 +535,12 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
>   mipi_dsi_set_drvdata(dsi, ddata);
>   ddata->dsi = dsi;
>  
> + id = of_match_node(dsicm_of_match, dev->of_node);
> + if (!id)
> + return -ENODEV;
> +
> + ddata->panel_data = id->data;

ddata->panel_data = 

[PATCH v5 17/29] drm/panel: panel-dsi-cm: add panel database to driver

2020-12-08 Thread Tomi Valkeinen
Add a panel database to the driver instead of reading propertes from DT
data. This is similar to panel-simple, and I believe it's more future
safe way to handle the panels.

Signed-off-by: Tomi Valkeinen 
Reviewed-by: Sam Ravnborg 
---
 drivers/gpu/drm/panel/panel-dsi-cm.c | 107 +--
 1 file changed, 69 insertions(+), 38 deletions(-)

diff --git a/drivers/gpu/drm/panel/panel-dsi-cm.c 
b/drivers/gpu/drm/panel/panel-dsi-cm.c
index fa564aad7f25..3fb5b2856283 100644
--- a/drivers/gpu/drm/panel/panel-dsi-cm.c
+++ b/drivers/gpu/drm/panel/panel-dsi-cm.c
@@ -21,10 +21,7 @@
 #include 
 #include 
 
-#include 
 #include 
-#include 
-#include 
 
 #define DCS_GET_ID10xda
 #define DCS_GET_ID20xdb
@@ -32,6 +29,18 @@
 
 #define DCS_REGULATOR_SUPPLY_NUM 2
 
+static const struct of_device_id dsicm_of_match[];
+
+struct dsic_panel_data {
+   u32 xres;
+   u32 yres;
+   u32 refresh;
+   u32 width_mm;
+   u32 height_mm;
+   u32 max_hs_rate;
+   u32 max_lp_rate;
+};
+
 struct panel_drv_data {
struct mipi_dsi_device *dsi;
struct drm_panel panel;
@@ -47,16 +56,14 @@ struct panel_drv_data {
 */
unsigned long   hw_guard_wait;  /* max guard time in jiffies */
 
-   /* panel HW configuration from DT or platform data */
+   const struct dsic_panel_data *panel_data;
+
struct gpio_desc *reset_gpio;
 
struct regulator_bulk_data supplies[DCS_REGULATOR_SUPPLY_NUM];
 
bool use_dsi_backlight;
 
-   int width_mm;
-   int height_mm;
-
/* runtime variables */
bool enabled;
 
@@ -450,11 +457,8 @@ static int dsicm_get_modes(struct drm_panel *panel,
return -ENOMEM;
}
 
-   drm_mode_set_name(mode);
-   mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
-
-   connector->display_info.width_mm = ddata->width_mm;
-   connector->display_info.height_mm = ddata->height_mm;
+   connector->display_info.width_mm = ddata->panel_data->width_mm;
+   connector->display_info.height_mm = ddata->panel_data->height_mm;
 
drm_mode_probed_add(connector, mode);
 
@@ -471,15 +475,10 @@ static const struct drm_panel_funcs dsicm_panel_funcs = {
 
 static int dsicm_probe_of(struct mipi_dsi_device *dsi)
 {
-   struct device_node *node = dsi->dev.of_node;
struct backlight_device *backlight;
struct panel_drv_data *ddata = mipi_dsi_get_drvdata(dsi);
-   struct display_timing timing;
-   struct videomode vm = {
-   .hactive = 864,
-   .vactive = 480,
-   };
int err;
+   struct drm_display_mode *mode = >mode;
 
ddata->reset_gpio = devm_gpiod_get(>dev, "reset", GPIOD_OUT_LOW);
if (IS_ERR(ddata->reset_gpio)) {
@@ -488,23 +487,16 @@ static int dsicm_probe_of(struct mipi_dsi_device *dsi)
return err;
}
 
-   err = of_get_display_timing(node, "panel-timing", );
-   if (!err) {
-   videomode_from_timing(, );
-   } else {
-   dev_warn(>dev,
-"failed to get video timing, using defaults\n");
-   }
-
-   if (!vm.pixelclock)
-   vm.pixelclock = vm.hactive * vm.vactive * 60;
-   drm_display_mode_from_videomode(, >mode);
-
-   ddata->width_mm = 0;
-   of_property_read_u32(node, "width-mm", >width_mm);
-
-   ddata->height_mm = 0;
-   of_property_read_u32(node, "height-mm", >height_mm);
+   mode->hdisplay = mode->hsync_start = mode->hsync_end = mode->htotal =
+   ddata->panel_data->xres;
+   mode->vdisplay = mode->vsync_start = mode->vsync_end = mode->vtotal =
+   ddata->panel_data->yres;
+   mode->clock = ddata->panel_data->xres * ddata->panel_data->yres *
+   ddata->panel_data->refresh / 1000;
+   mode->width_mm = ddata->panel_data->width_mm;
+   mode->height_mm = ddata->panel_data->height_mm;
+   mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
+   drm_mode_set_name(mode);
 
ddata->supplies[0].supply = "vpnl";
ddata->supplies[1].supply = "vddi";
@@ -531,6 +523,7 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
struct panel_drv_data *ddata;
struct backlight_device *bldev = NULL;
struct device *dev = >dev;
+   const struct of_device_id *id;
int r;
 
dev_dbg(dev, "probe\n");
@@ -542,6 +535,12 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
mipi_dsi_set_drvdata(dsi, ddata);
ddata->dsi = dsi;
 
+   id = of_match_node(dsicm_of_match, dev->of_node);
+   if (!id)
+   return -ENODEV;
+
+   ddata->panel_data = id->data;
+
r = dsicm_probe_of(dsi);
if (r)
return r;
@@ -578,8 +577,8 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
dsi->format = MIPI_DSI_FMT_RGB888;
dsi->mode_flags =