Re: [PATCH v2] drm/panel/tianma-tl057fvxp01: add panel for Motorola Moto G6

2021-10-18 Thread Julian Braha
On Sunday, October 17, 2021 1:33:05 PM EDT Sam Ravnborg wrote:
> Hi Julian,
> 
> On Sun, Aug 08, 2021 at 04:08:54PM -0400, Julian Braha wrote:
> > This is a 5.7" 2160x1080 panel found on the Motorola Moto G6.
> > There may be other smartphones using it, as well.
> > 
> > Signed-off-by: Julian Braha 
> 
> Sorry for coming back so late. Driver looks good and is almost
> ready to apply. One detail you need to fix, see below.
> 
>   Sam
> 
> > ---
> > +
> > +static const struct of_device_id tianma_tl057fvxp01_of_match[] = {
> > +   { .compatible = "tianma,tl057fvxp01" },
> > +   { /* sentinel */ }
> > +};
> The compatible needs to be documented before I can include the driver in
> the kernel. Please add a patch that document the compatible - maybe as a
> new binding file but preferably as part of one of the existing binding
> files.
> 
>   Sam
> 

Hi Sam,

Thanks for your feedback! I've submitted a second patch for the bindings.

- Julian Braha




Re: [PATCH v2] drm/panel/tianma-tl057fvxp01: add panel for Motorola Moto G6

2021-10-17 Thread Sam Ravnborg
Hi Julian,

On Sun, Aug 08, 2021 at 04:08:54PM -0400, Julian Braha wrote:
> This is a 5.7" 2160x1080 panel found on the Motorola Moto G6.
> There may be other smartphones using it, as well.
> 
> Signed-off-by: Julian Braha 

Sorry for coming back so late. Driver looks good and is almost
ready to apply. One detail you need to fix, see below.

Sam

> ---
> +
> +static const struct of_device_id tianma_tl057fvxp01_of_match[] = {
> + { .compatible = "tianma,tl057fvxp01" },
> + { /* sentinel */ }
> +};
The compatible needs to be documented before I can include the driver in
the kernel. Please add a patch that document the compatible - maybe as a
new binding file but preferably as part of one of the existing binding
files.

Sam


[PATCH v2] drm/panel/tianma-tl057fvxp01: add panel for Motorola Moto G6

2021-08-08 Thread Julian Braha
This is a 5.7" 2160x1080 panel found on the Motorola Moto G6.
There may be other smartphones using it, as well.

Signed-off-by: Julian Braha 
---
 drivers/gpu/drm/panel/Kconfig |   7 +
 drivers/gpu/drm/panel/Makefile|   1 +
 .../gpu/drm/panel/panel-tianma-tl057fvxp01.c  | 262 ++
 3 files changed, 270 insertions(+)
 create mode 100644 drivers/gpu/drm/panel/panel-tianma-tl057fvxp01.c

diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig
index beb581b96ecd..9e8a5fffa626 100644
--- a/drivers/gpu/drm/panel/Kconfig
+++ b/drivers/gpu/drm/panel/Kconfig
@@ -557,6 +557,13 @@ config DRM_PANEL_TDO_TL070WSH30
  24 bit RGB per pixel. It provides a MIPI DSI interface to
  the host, a built-in LED backlight and touch controller.
 
+config DRM_PANEL_TIANMA_TL057FVXP01
+   tristate "Tianma TL057FVXP01 panel"
+   select DRM_PANEL_MIPI_DSI_COMMON
+   help
+ Say Y here if you want to enable support for the Tianma TL057FVXP01
+ 2160x1080 5.7" panel (found on the Motorola Moto G6).
+
 config DRM_PANEL_TPO_TD028TTEC1
tristate "Toppoly (TPO) TD028TTEC1 panel driver"
depends on OF && SPI
diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile
index c8132050bcec..9bdc2a12e719 100644
--- a/drivers/gpu/drm/panel/Makefile
+++ b/drivers/gpu/drm/panel/Makefile
@@ -57,6 +57,7 @@ obj-$(CONFIG_DRM_PANEL_SITRONIX_ST7789V) += 
panel-sitronix-st7789v.o
 obj-$(CONFIG_DRM_PANEL_SONY_ACX424AKP) += panel-sony-acx424akp.o
 obj-$(CONFIG_DRM_PANEL_SONY_ACX565AKM) += panel-sony-acx565akm.o
 obj-$(CONFIG_DRM_PANEL_TDO_TL070WSH30) += panel-tdo-tl070wsh30.o
+obj-$(CONFIG_DRM_PANEL_TIANMA_TL057FVXP01) += panel-tianma-tl057fvxp01.o
 obj-$(CONFIG_DRM_PANEL_TPO_TD028TTEC1) += panel-tpo-td028ttec1.o
 obj-$(CONFIG_DRM_PANEL_TPO_TD043MTEA1) += panel-tpo-td043mtea1.o
 obj-$(CONFIG_DRM_PANEL_TPO_TPG110) += panel-tpo-tpg110.o
diff --git a/drivers/gpu/drm/panel/panel-tianma-tl057fvxp01.c 
b/drivers/gpu/drm/panel/panel-tianma-tl057fvxp01.c
new file mode 100644
index ..7dcdcbd8ef5f
--- /dev/null
+++ b/drivers/gpu/drm/panel/panel-tianma-tl057fvxp01.c
@@ -0,0 +1,262 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2021 Julian Braha 
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ * Generated with linux-mdss-dsi-panel-driver-generator from vendor device tree
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+
+#include 
+#include 
+#include 
+
+struct tianma_tl057fvxp01 {
+   struct drm_panel panel;
+   struct mipi_dsi_device *dsi;
+   struct gpio_desc *reset_gpio;
+   bool prepared;
+};
+
+static inline struct tianma_tl057fvxp01 *to_tianma_tl057fvxp01(struct 
drm_panel *panel)
+{
+   return container_of(panel, struct tianma_tl057fvxp01, panel);
+}
+
+#define dsi_dcs_write_seq(dsi, seq...) do {\
+   static const u8 d[] = { seq };  \
+   int ret;\
+   ret = mipi_dsi_dcs_write_buffer(dsi, d, ARRAY_SIZE(d)); \
+   if (ret < 0)\
+   return ret; \
+   } while (0)
+
+static void tianma_tl057fvxp01_reset(struct tianma_tl057fvxp01 *ctx)
+{
+   gpiod_set_value_cansleep(ctx->reset_gpio, 0);
+   usleep_range(5000, 6000);
+   gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+   usleep_range(1000, 2000);
+   gpiod_set_value_cansleep(ctx->reset_gpio, 0);
+   usleep_range(1, 11000);
+}
+
+static int tianma_tl057fvxp01_on(struct tianma_tl057fvxp01 *ctx)
+{
+   struct mipi_dsi_device *dsi = ctx->dsi;
+   struct device *dev = >dev;
+   int ret;
+
+   dsi_dcs_write_seq(dsi, 0x00, 0x00);
+   dsi_dcs_write_seq(dsi, 0xff, 0x19, 0x11, 0x01);
+   dsi_dcs_write_seq(dsi, 0x00, 0x80);
+   dsi_dcs_write_seq(dsi, 0xff, 0x19, 0x11);
+   dsi_dcs_write_seq(dsi, 0x00, 0xb0);
+   dsi_dcs_write_seq(dsi, 0xb3, 0x04, 0x38, 0x08, 0x70);
+   dsi_dcs_write_seq(dsi, 0x00, 0x00);
+   dsi_dcs_write_seq(dsi, 0xff, 0xff, 0xff, 0xff);
+   dsi_dcs_write_seq(dsi, 0x35, 0x00);
+   dsi_dcs_write_seq(dsi, 0x51, 0xcc, 0x08);
+   dsi_dcs_write_seq(dsi, 0x53, 0x2c);
+   dsi_dcs_write_seq(dsi, 0x55, 0x01);
+
+   ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
+   if (ret < 0) {
+   dev_err(dev, "Failed to exit sleep mode: %d\n", ret);
+   return ret;
+   }
+   msleep(120);
+
+   ret = mipi_dsi_dcs_set_display_on(dsi);
+   if (ret < 0) {
+   dev_err(dev, "Failed to set display on: %d\n", ret);
+   return ret;
+   }
+   usleep_range(1, 11000);
+
+   return 0;
+}
+
+static int tianma_tl057fvxp01_off(struct tianma_tl057fvxp01 *ctx)
+{
+   struct mipi_dsi_device *dsi = ctx->dsi;
+