drm/panel: Add panel driver for the Mantix MLAF057WE51-X DSI panel
Subsystems (5)
Guido Günther
maintainerv2 cover drm/panel: Add panel driver for the Mantix MLAF057WE51-X DSI panel
The panel uses a Focaltech FT8006p, the touch part is handled by the already existing edt-ft5x06. It can be found in e.g. the Librem 5.
Changes from v1:
- Due to review comments by Sam Ravnborg, thanks!
https://lore.kernel.org/dri-devel/[email protected]/
- Don't preserve newlines with '|' in description
- Use reset-gpios and backlight from panel-common.yaml
- Reindent example
https://lore.kernel.org/dri-devel/[email protected]/
- Drop unused includes
- Use dev_* instead of DRM_* for printing
- Turn off regulators in reverse order from enable
- Silence errors in mantix_{shutdown,remove}
- Drop duplicate mipi_dsi_dcs_enter_sleep_mode()
https://lore.kernel.org/dri-devel/[email protected]/
- Use dev_err_probe()
- Add delays when turning off panel as suggested by the data sheet
This series is against next-20200814.
Guido Günther (3):
dt-bindings: vendor-prefixes: Add mantix vendor prefix
dt-bindings: Add Mantix MLAF057WE51-X panel bindings drm/panel: Add panel driver for the Mantix MLAF057WE51-X DSI panel
.../display/panel/mantix,mlaf057we51-x.yaml | 70 ++++ .../devicetree/bindings/vendor-prefixes.yaml | 2 + MAINTAINERS | 7 + drivers/gpu/drm/panel/Kconfig | 11 + drivers/gpu/drm/panel/Makefile | 1 + .../gpu/drm/panel/panel-mantix-mlaf057we51.c | 328 ++++++++++++++++++ 6 files changed, 419 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/mantix,mlaf057we51-x.yaml create mode 100644 drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c
Signature · 6 lines
2.26.2 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Guido Günther
maintainerPATCH v2 1/3 dt-bindings: vendor-prefixes: Add mantix vendor prefix
Add prefix for Mantix Display Technology Co.,Ltd.
--- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/vendor-prefixes.yaml +2 -0
@@ -611,6 +611,8 @@ patternProperties: description: Linux Automation GmbH "^macnica,.*": description: Macnica Americas + "^mantix,.*": + description: Mantix Display Technology Co.,Ltd. "^mapleboard,.*": description: Mapleboard.org "^marvell,.*":
Signature · 6 lines
2.26.2 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH v2 1/3] dt-bindings: vendor-prefixes: Add mantix vendor prefix
Quoted 3 lines · Guido Günther
Add prefix for Mantix Display Technology Co.,Ltd.
Signed-off-by Guido Günther <[email protected]>
Quoted 19 lines
--- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+)Documentation/devicetree/bindings/vendor-prefixes.yaml +2
-0@@ -611,6 +611,8 @@ patternProperties: description: Linux Automation GmbH "^macnica,.*": description: Macnica Americas + "^mantix,.*": + description: Mantix Display Technology Co.,Ltd. "^mapleboard,.*": description: Mapleboard.org "^marvell,.*":Signature · 1 line
2.26.2
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Guido Günther
maintainerPATCH v2 2/3 dt-bindings: Add Mantix MLAF057WE51-X panel bindings
In reply to Guido GüntherThe panel uses a Focaltech FT8006p, the touch part is handled by the already existing edt-ft5x06.
--- .../display/panel/mantix,mlaf057we51-x.yaml | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/mantix,mlaf057we51-x.yaml
Documentation/devicetree/bindings/display/panel/mantix,mlaf057we51-x.yaml new file +70 -0
@@ -0,0 +1,70 @@ +# SPDX-License-Identifier: (GPL-2.0-only or BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/panel/mantix,mlaf057we51-x.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Mantix MLAF057WE51-X 5.7" 720x1440 TFT LCD panel + +maintainers: + - Guido Günther <[email protected]> + +description: + Mantix MLAF057WE51 X is a 720x1440 TFT LCD panel connected using + a MIPI-DSI video interface. + +allOf: + - $ref: panel-common.yaml# + +properties: + compatible: + enum: + - mantix,mlaf057we51-x + + port: true + reg: + maxItems: 1 + description: DSI virtual channel + + avdd-supply: + description: Positive analog power supply + + avee-supply: + description: Negative analog power supply + + vddi-supply: + description: 1.8V I/O voltage supply + + reset-gpios: true + + backlight: true + +required: + - compatible + - reg + - avdd-supply + - avee-supply + - vddi-supply + - reset-gpios + +additionalProperties: false + +examples: + - | + #include <dt-bindings/gpio/gpio.h> + + dsi { + #address-cells = <1>; + #size-cells = <0>; + panel@0 { + compatible = "mantix,mlaf057we51-x"; + reg = <0>; + avdd-supply = <®_avdd>; + avee-supply = <®_avee>; + vddi-supply = <®_1v8_p>; + reset-gpios = <&gpio1 29 GPIO_ACTIVE_LOW>; + backlight = <&backlight>; + }; + }; + +...
Signature · 6 lines
2.26.2 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH v2 2/3] dt-bindings: Add Mantix MLAF057WE51-X panel bindings
Quoted 4 lines · Guido Günther
The panel uses a Focaltech FT8006p, the touch part is handled by the already existing edt-ft5x06.
Signed-off-by Guido Günther <[email protected]>
I assume you will apply yourself, otherwise I will do so when we have seen a backmerge.
Sam
Quoted 83 lines
--- .../display/panel/mantix,mlaf057we51-x.yaml | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/mantix,mlaf057we51-x.yamlDocumentation/devicetree/bindings/display/panel/mantix,mlaf057we51-x.yaml new file +70
-0@@ -0,0 +1,70 @@ +# SPDX-License-Identifier: (GPL-2.0-only or BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/panel/mantix,mlaf057we51-x.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Mantix MLAF057WE51-X 5.7" 720x1440 TFT LCD panel + +maintainers: + - Guido Günther <[email protected]> + +description: + Mantix MLAF057WE51 X is a 720x1440 TFT LCD panel connected using + a MIPI-DSI video interface. + +allOf: + - $ref: panel-common.yaml# + +properties: + compatible: + enum: + - mantix,mlaf057we51-x + + port: true + reg: + maxItems: 1 + description: DSI virtual channel + + avdd-supply: + description: Positive analog power supply + + avee-supply: + description: Negative analog power supply + + vddi-supply: + description: 1.8V I/O voltage supply + + reset-gpios: true + + backlight: true + +required: + - compatible + - reg + - avdd-supply + - avee-supply + - vddi-supply + - reset-gpios + +additionalProperties: false + +examples: + - | + #include <dt-bindings/gpio/gpio.h> + + dsi { + #address-cells = <1>; + #size-cells = <0>; + panel@0 { + compatible = "mantix,mlaf057we51-x"; + reg = <0>; + avdd-supply = <®_avdd>; + avee-supply = <®_avee>; + vddi-supply = <®_1v8_p>; + reset-gpios = <&gpio1 29 GPIO_ACTIVE_LOW>; + backlight = <&backlight>; + }; + }; + +...Signature · 1 line
2.26.2
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Guido Günther
maintainerPATCH v2 3/3 drm/panel: Add panel driver for the Mantix MLAF057WE51-X DSI panel
In reply to Guido GüntherThe panel uses a Focaltech FT8006p, the touch part is handled by the already existing edt-ft5x06.
--- MAINTAINERS | 7 + drivers/gpu/drm/panel/Kconfig | 11 + drivers/gpu/drm/panel/Makefile | 1 + .../gpu/drm/panel/panel-mantix-mlaf057we51.c | 328 ++++++++++++++++++ 4 files changed, 347 insertions(+) create mode 100644 drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c
MAINTAINERS +7 -0
@@ -5474,6 +5474,13 @@ S: Maintained F: drivers/gpu/drm/panel/panel-lvds.c F: Documentation/devicetree/bindings/display/panel/lvds.yaml +DRM DRIVER FOR MANTIX MLAF057WE51 PANELS +M: Guido Günther <[email protected]> +R: Purism Kernel Team <[email protected]> +S: Maintained +F: Documentation/devicetree/bindings/display/panel/mantix,mlaf057we51-x.yaml +F: drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c + DRM DRIVER FOR MATROX G200/G400 GRAPHICS CARDS S: Orphan / Obsolete F: drivers/gpu/drm/mga/
drivers/gpu/drm/panel/Kconfig +11 -0
@@ -217,6 +217,17 @@ config DRM_PANEL_NOVATEK_NT39016 Say Y here if you want to enable support for the panels built around the Novatek NT39016 display controller. +config DRM_PANEL_MANTIX_MLAF057WE51 + tristate "Mantix MLAF057WE51-X MIPI-DSI LCD panel" + depends on OF + depends on DRM_MIPI_DSI + depends on BACKLIGHT_CLASS_DEVICE + help + Say Y here if you want to enable support for the Mantix + MLAF057WE51-X MIPI DSI panel as e.g. used in the Librem 5. It + has a resolution of 720x1440 pixels, a built in backlight and touch + controller. + config DRM_PANEL_OLIMEX_LCD_OLINUXINO tristate "Olimex LCD-OLinuXino panel" depends on OF
drivers/gpu/drm/panel/Makefile +1 -0
@@ -20,6 +20,7 @@ obj-$(CONFIG_DRM_PANEL_LG_LG4573) += panel-lg-lg4573.o obj-$(CONFIG_DRM_PANEL_NEC_NL8048HL11) += panel-nec-nl8048hl11.o obj-$(CONFIG_DRM_PANEL_NOVATEK_NT35510) += panel-novatek-nt35510.o obj-$(CONFIG_DRM_PANEL_NOVATEK_NT39016) += panel-novatek-nt39016.o +obj-$(CONFIG_DRM_PANEL_MANTIX_MLAF057WE51) += panel-mantix-mlaf057we51.o obj-$(CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO) += panel-olimex-lcd-olinuxino.o obj-$(CONFIG_DRM_PANEL_ORISETECH_OTM8009A) += panel-orisetech-otm8009a.o obj-$(CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS) += panel-osd-osd101t2587-53ts.o
drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c new file +328 -0
328 lines not on this page · raw message
Signature · 6 lines
2.26.2 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Hi Guido.
Quoted 4 lines · Guido Günther
The panel uses a Focaltech FT8006p, the touch part is handled by the already existing edt-ft5x06.
Signed-off-by Guido Günther <[email protected]>
Two small nits - otherwise looks good.
I can fix while applying or you can send a new revision, but I cannot apply until drm-misc-next have seen a backmerge due to dev_err_probe() usage.
Did you have commit rights yet?
If yes, then please apply yourself.
Sam
Quoted 75 lines
--- MAINTAINERS | 7 + drivers/gpu/drm/panel/Kconfig | 11 + drivers/gpu/drm/panel/Makefile | 1 + .../gpu/drm/panel/panel-mantix-mlaf057we51.c | 328 ++++++++++++++++++ 4 files changed, 347 insertions(+) create mode 100644 drivers/gpu/drm/panel/panel-mantix-mlaf057we51.cMAINTAINERS +7
-0@@ -5474,6 +5474,13 @@ S: Maintained F: drivers/gpu/drm/panel/panel-lvds.c F: Documentation/devicetree/bindings/display/panel/lvds.yaml +DRM DRIVER FOR MANTIX MLAF057WE51 PANELS +M: Guido Günther <[email protected]> +R: Purism Kernel Team <[email protected]> +S: Maintained +F: Documentation/devicetree/bindings/display/panel/mantix,mlaf057we51-x.yaml +F: drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c + DRM DRIVER FOR MATROX G200/G400 GRAPHICS CARDS S: Orphan / Obsolete F: drivers/gpu/drm/mga/drivers/gpu/drm/panel/Kconfig +11
-0@@ -217,6 +217,17 @@ config DRM_PANEL_NOVATEK_NT39016 Say Y here if you want to enable support for the panels built around the Novatek NT39016 display controller. +config DRM_PANEL_MANTIX_MLAF057WE51 + tristate "Mantix MLAF057WE51-X MIPI-DSI LCD panel" + depends on OF + depends on DRM_MIPI_DSI + depends on BACKLIGHT_CLASS_DEVICE + help + Say Y here if you want to enable support for the Mantix + MLAF057WE51-X MIPI DSI panel as e.g. used in the Librem 5. It + has a resolution of 720x1440 pixels, a built in backlight and touch + controller. + config DRM_PANEL_OLIMEX_LCD_OLINUXINO tristate "Olimex LCD-OLinuXino panel" depends on OFdrivers/gpu/drm/panel/Makefile +1
-0@@ -20,6 +20,7 @@ obj-$(CONFIG_DRM_PANEL_LG_LG4573) += panel-lg-lg4573.o obj-$(CONFIG_DRM_PANEL_NEC_NL8048HL11) += panel-nec-nl8048hl11.o obj-$(CONFIG_DRM_PANEL_NOVATEK_NT35510) += panel-novatek-nt35510.o obj-$(CONFIG_DRM_PANEL_NOVATEK_NT39016) += panel-novatek-nt39016.o +obj-$(CONFIG_DRM_PANEL_MANTIX_MLAF057WE51) += panel-mantix-mlaf057we51.o obj-$(CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO) += panel-olimex-lcd-olinuxino.o obj-$(CONFIG_DRM_PANEL_ORISETECH_OTM8009A) += panel-orisetech-otm8009a.o obj-$(CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS) += panel-osd-osd101t2587-53ts.odrivers/gpu/drm/panel/panel-mantix-mlaf057we51.c new file +9
-0@@ -0,0 +1,328 @@ +// SPDX-License-Identifier: GPL-2.0 +/* +* Mantix MLAF057WE51 5.7" MIPI-DSI panel driver +* +* Copyright (C) Purism SPC 2020 +*/ + +#include <linux/backlight.h> +#include <linux/delay.h>
drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c line 19
Quoted 10 lines
drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c new file +10
-0+#include <linux/gpio/consumer.h> +#include <linux/module.h> +#include <linux/regulator/consumer.h> + +#include <video/mipi_display.h> + +#include <drm/drm_mipi_dsi.h> +#include <drm/drm_modes.h> +#include <drm/drm_panel.h> +#include <drm/drm_print.h>
drm_print.h is no longer used - drop.
Quoted 121 lines
drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c new file +121
-0+ +#define DRV_NAME "panel-mantix-mlaf057we51" + +/* Manufacturer specific Commands send via DSI */ +#define MANTIX_CMD_OTP_STOP_RELOAD_MIPI 0x41 +#define MANTIX_CMD_INT_CANCEL 0x4C + +struct mantix { +struct device *dev; +struct drm_panel panel; +struct gpio_desc *reset_gpio; + +struct regulator *avdd; +struct regulator *avee; +struct regulator *vddi; +}; + +static inline struct mantix *panel_to_mantix (struct drm_panel *panel) +{ + return container_of(panel, struct mantix, panel); +} + +#define dsi_generic_write_seq(dsi, seq...) do { \ + static const u8 d[] = { seq }; \ + int ret; \ + ret = mipi_dsi_generic_write(dsi, d, ARRAY_SIZE(d)); \ + if (ret < 0) \ + return ret; \ + } while (0) + +static int mantix_init_sequence (struct mantix *ctx) +{ +struct mipi_dsi_device *dsi =to_mipi_dsi_device (ctx->dev); +struct device *dev = ctx->dev; + +/* +* Init sequence was supplied by the panel vendor. +*/ +dsi_generic_write_seq (dsi,MANTIX_CMD_OTP_STOP_RELOAD_MIPI ,0x5A ); + +dsi_generic_write_seq (dsi,MANTIX_CMD_INT_CANCEL ,0x03 ); +dsi_generic_write_seq (dsi,MANTIX_CMD_OTP_STOP_RELOAD_MIPI ,0x5A ,0x03 ); +dsi_generic_write_seq (dsi,0x80 ,0xA9 ,0x00 ); + +dsi_generic_write_seq (dsi,MANTIX_CMD_OTP_STOP_RELOAD_MIPI ,0x5A ,0x09 ); +dsi_generic_write_seq (dsi,0x80 ,0x64 ,0x00 ,0x64 ,0x00 ,0x00 ); +msleep (20 ); + +dev_dbg (dev,"Panel init sequence done\n" ); +return 0 ; +} + +static int mantix_enable (struct drm_panel *panel) +{ +struct mantix *ctx =panel_to_mantix (panel); +struct device *dev = ctx->dev; +struct mipi_dsi_device *dsi =to_mipi_dsi_device (dev); +int ret; + + ret =mantix_init_sequence (ctx); +if (ret <0 ) { +dev_err (ctx->dev,"Panel init sequence failed: %d\n" , ret); +return ret; + } + + ret =mipi_dsi_dcs_exit_sleep_mode (dsi); +if (ret <0 ) { +dev_err (dev,"Failed to exit sleep mode\n" ); +return ret; + } +msleep (20 ); + + ret =mipi_dsi_dcs_set_display_on (dsi); +if (ret) +return ret; +usleep_range (10000 ,12000 ); + + ret =mipi_dsi_turn_on_peripheral (dsi); +if (ret <0 ) { +dev_err (dev,"Failed to turn on peripheral\n" ); +return ret; + } + +return 0 ; +} + +static int mantix_disable (struct drm_panel *panel) +{ +struct mantix *ctx =panel_to_mantix (panel); +struct mipi_dsi_device *dsi =to_mipi_dsi_device (ctx->dev); +int ret; + + ret =mipi_dsi_dcs_set_display_off (dsi); +if (ret <0 ) +dev_err (ctx->dev,"Failed to turn off the display: %d\n" , ret); + + ret =mipi_dsi_dcs_enter_sleep_mode (dsi); +if (ret <0 ) +dev_err (ctx->dev,"Failed to enter sleep mode: %d\n" , ret); + + +return 0 ; +} + +static int mantix_unprepare (struct drm_panel *panel) +{ +struct mantix *ctx =panel_to_mantix (panel); + +regulator_disable (ctx->avee); +regulator_disable (ctx->avdd); +/* T11 */ +usleep_range (5000 ,6000 ); +regulator_disable (ctx->vddi); +/* T14 */ +msleep (50 ); + +return 0 ; +} + +static int mantix_prepare (struct drm_panel *panel) +{
drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c line 150
Quoted 10 lines
drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c new file +10
-0+struct mantix *ctx =panel_to_mantix (panel); +int ret; + +/* Focaltech FT8006P, section 7.3.1 and 7.3.4 */ +dev_dbg (ctx->dev,"Resetting the panel\n" ); + ret =regulator_enable (ctx->vddi); +if (ret <0 ) { +dev_err (ctx->dev,"Failed to enable vddi supply: %d\n" , ret); +return ret; + }
Maybe add one empty line here
Quoted 180 lines
drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c new file +178
-0+/* T1 + T2 */ +usleep_range (8000 ,10000 ); + + ret =regulator_enable (ctx->avdd); +if (ret <0 ) { +dev_err (ctx->dev,"Failed to enable avdd supply: %d\n" , ret); +return ret; + } + +/* T2d */ +usleep_range (3500 ,4000 ); + ret =regulator_enable (ctx->avee); +if (ret <0 ) { +dev_err (ctx->dev,"Failed to enable avee supply: %d\n" , ret); +return ret; + } + +/* T3+T5 */ +usleep_range (10000 ,12000 ); + +gpiod_set_value_cansleep (ctx->reset_gpio,1 ); +usleep_range (5150 ,7000 ); + +gpiod_set_value_cansleep (ctx->reset_gpio,0 ); + +/* T6 */ +msleep (50 ); + +return 0 ; +} + +static const struct drm_display_mode default_mode = { + .hdisplay =720 , + .hsync_start =720 +45 , + .hsync_end =720 +45 +14 , + .htotal =720 +45 +14 +25 , + .vdisplay =1440 , + .vsync_start =1440 +130 , + .vsync_end =1440 +130 +8 , + .vtotal =1440 +130 +8 +106 , + .clock =85298 , + .flags =DRM_MODE_FLAG_NHSYNC |DRM_MODE_FLAG_NVSYNC , + .width_mm =65 , + .height_mm =130 , +}; + +static int mantix_get_modes (struct drm_panel *panel, +struct drm_connector *connector) +{ +struct mantix *ctx =panel_to_mantix (panel); +struct drm_display_mode *mode; + + mode =drm_mode_duplicate (connector->dev, &default_mode); +if (!mode) { +dev_err (ctx->dev,"Failed to add mode %ux%u@%u\n" , + default_mode.hdisplay, default_mode.vdisplay, +drm_mode_vrefresh (mode)); +return -ENOMEM ; + } + +drm_mode_set_name (mode); + + mode->type =DRM_MODE_TYPE_DRIVER |DRM_MODE_TYPE_PREFERRED ; + connector->display_info.width_mm = mode->width_mm; + connector->display_info.height_mm = mode->height_mm; +drm_mode_probed_add (connector, mode); + +return 1 ; +} + +static const struct drm_panel_funcs mantix_drm_funcs = { + .disable = mantix_disable, + .unprepare = mantix_unprepare, + .prepare = mantix_prepare, + .enable = mantix_enable, + .get_modes = mantix_get_modes, +}; + +static int mantix_probe (struct mipi_dsi_device *dsi) +{ +struct device *dev = &dsi->dev; +struct mantix *ctx; +int ret; + + ctx =devm_kzalloc (dev,sizeof (*ctx),GFP_KERNEL ); +if (!ctx) +return -ENOMEM ; + + ctx->reset_gpio =devm_gpiod_get (dev,"reset" ,GPIOD_OUT_LOW ); +if (IS_ERR (ctx->reset_gpio)) { +dev_err (dev,"cannot get reset gpio\n" ); +return PTR_ERR (ctx->reset_gpio); + } + +mipi_dsi_set_drvdata (dsi, ctx); + ctx->dev = dev; + + dsi->lanes =4 ; + dsi->format =MIPI_DSI_FMT_RGB888 ; + dsi->mode_flags =MIPI_DSI_MODE_VIDEO | +MIPI_DSI_MODE_VIDEO_BURST |MIPI_DSI_MODE_VIDEO_SYNC_PULSE ; + + ctx->avdd =devm_regulator_get (dev,"avdd" ); +if (IS_ERR (ctx->avdd)) +return dev_err_probe (dev,PTR_ERR (ctx->avdd),"Failed to request avdd regulator\n" ); + + ctx->avee =devm_regulator_get (dev,"avee" ); +if (IS_ERR (ctx->avee)) +return dev_err_probe (dev,PTR_ERR (ctx->avee),"Failed to request avee regulator\n" ); + + ctx->vddi =devm_regulator_get (dev,"vddi" ); +if (IS_ERR (ctx->vddi)) +return dev_err_probe (dev,PTR_ERR (ctx->vddi),"Failed to request vddi regulator\n" ); + +drm_panel_init (&ctx->panel, dev, &mantix_drm_funcs, +DRM_MODE_CONNECTOR_DSI ); + + ret =drm_panel_of_backlight (&ctx->panel); +if (ret) +return ret; + +drm_panel_add (&ctx->panel); + + ret =mipi_dsi_attach (dsi); +if (ret <0 ) { +dev_err (dev,"mipi_dsi_attach failed (%d). Is host ready?\n" , ret); +drm_panel_remove (&ctx->panel); +return ret; + } + +dev_info (dev,"%ux%u@%u %ubpp dsi %udl - ready\n" , + default_mode.hdisplay, default_mode.vdisplay, +drm_mode_vrefresh (&default_mode), +mipi_dsi_pixel_format_to_bpp (dsi->format), dsi->lanes); + +return 0 ; +} + +static void mantix_shutdown (struct mipi_dsi_device *dsi) +{ +struct mantix *ctx =mipi_dsi_get_drvdata (dsi); + +drm_panel_unprepare (&ctx->panel); +drm_panel_disable (&ctx->panel); +} + +static int mantix_remove (struct mipi_dsi_device *dsi) +{ +struct mantix *ctx =mipi_dsi_get_drvdata (dsi); + +mantix_shutdown (dsi); + +mipi_dsi_detach (dsi); +drm_panel_remove (&ctx->panel); + +return 0 ; +} + +static const struct of_device_id mantix_of_match[] = { + { .compatible ="mantix,mlaf057we51-x" }, + {/* sentinel */ } +}; +MODULE_DEVICE_TABLE (of, mantix_of_match); + +static struct mipi_dsi_driver mantix_driver = { + .probe = mantix_probe, + .remove = mantix_remove, + .shutdown = mantix_shutdown, + .driver = { + .name =DRV_NAME , + .of_match_table = mantix_of_match, + }, +}; +module_mipi_dsi_driver (mantix_driver); + +MODULE_AUTHOR ("Guido Günther <[email protected]>" ); +MODULE_DESCRIPTION ("DRM driver for Mantix MLAF057WE51-X MIPI DSI panel" ); +MODULE_LICENSE ("GPL v2" );Signature · 1 line
2.26.2
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Guido Günther
maintainerHi Sam,
thanks for having a look!
Quoted 6 lines · Sam Ravnborg
Hi Guido.
Quoted 3 lines · Guido Günther
The panel uses a Focaltech FT8006p, the touch part is handled by the already existing edt-ft5x06.
Quoted 8 lines
Quoted 1 line
Signed-off-by Guido Günther <[email protected]>Two small nits - otherwise looks good.
Reviewed-by Sam Ravnborg <[email protected]>I can fix while applying or you can send a new revision, but I cannot apply until drm-misc-next have seen a backmerge due to
dev_err_probe()usage.
I'll send out a v3 with this fixed.
Quoted 2 lines
Did you have commit rights yet?
If yes, then please apply yourself.
No commit rights here. So it would be great if you could apply the patches. Should I look for commit rights? I assume that means following
https://drm.pages.freedesktop.org/maintainer-tools/commit-access.html#drm-misc
Cheers,
-- Guido
Quoted 394 lines
Sam
Quoted 75 lines
--- MAINTAINERS | 7 + drivers/gpu/drm/panel/Kconfig | 11 + drivers/gpu/drm/panel/Makefile | 1 + .../gpu/drm/panel/panel-mantix-mlaf057we51.c | 328 ++++++++++++++++++ 4 files changed, 347 insertions(+) create mode 100644 drivers/gpu/drm/panel/panel-mantix-mlaf057we51.cMAINTAINERS +7
-0@@ -5474,6 +5474,13 @@ S: Maintained F: drivers/gpu/drm/panel/panel-lvds.c F: Documentation/devicetree/bindings/display/panel/lvds.yaml +DRM DRIVER FOR MANTIX MLAF057WE51 PANELS +M: Guido Günther <[email protected]> +R: Purism Kernel Team <[email protected]> +S: Maintained +F: Documentation/devicetree/bindings/display/panel/mantix,mlaf057we51-x.yaml +F: drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c + DRM DRIVER FOR MATROX G200/G400 GRAPHICS CARDS S: Orphan / Obsolete F: drivers/gpu/drm/mga/drivers/gpu/drm/panel/Kconfig +11
-0@@ -217,6 +217,17 @@ config DRM_PANEL_NOVATEK_NT39016 Say Y here if you want to enable support for the panels built around the Novatek NT39016 display controller. +config DRM_PANEL_MANTIX_MLAF057WE51 + tristate "Mantix MLAF057WE51-X MIPI-DSI LCD panel" + depends on OF + depends on DRM_MIPI_DSI + depends on BACKLIGHT_CLASS_DEVICE + help + Say Y here if you want to enable support for the Mantix + MLAF057WE51-X MIPI DSI panel as e.g. used in the Librem 5. It + has a resolution of 720x1440 pixels, a built in backlight and touch + controller. + config DRM_PANEL_OLIMEX_LCD_OLINUXINO tristate "Olimex LCD-OLinuXino panel" depends on OFdrivers/gpu/drm/panel/Makefile +1
-0@@ -20,6 +20,7 @@ obj-$(CONFIG_DRM_PANEL_LG_LG4573) += panel-lg-lg4573.o obj-$(CONFIG_DRM_PANEL_NEC_NL8048HL11) += panel-nec-nl8048hl11.o obj-$(CONFIG_DRM_PANEL_NOVATEK_NT35510) += panel-novatek-nt35510.o obj-$(CONFIG_DRM_PANEL_NOVATEK_NT39016) += panel-novatek-nt39016.o +obj-$(CONFIG_DRM_PANEL_MANTIX_MLAF057WE51) += panel-mantix-mlaf057we51.o obj-$(CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO) += panel-olimex-lcd-olinuxino.o obj-$(CONFIG_DRM_PANEL_ORISETECH_OTM8009A) += panel-orisetech-otm8009a.o obj-$(CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS) += panel-osd-osd101t2587-53ts.odrivers/gpu/drm/panel/panel-mantix-mlaf057we51.c new file +9
-0@@ -0,0 +1,328 @@ +// SPDX-License-Identifier: GPL-2.0 +/* +* Mantix MLAF057WE51 5.7" MIPI-DSI panel driver +* +* Copyright (C) Purism SPC 2020 +*/ + +#include <linux/backlight.h> +#include <linux/delay.h> drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c line 19
Quoted 10 lines
drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c new file +10
-0+#include <linux/gpio/consumer.h> +#include <linux/module.h> +#include <linux/regulator/consumer.h> + +#include <video/mipi_display.h> + +#include <drm/drm_mipi_dsi.h> +#include <drm/drm_modes.h> +#include <drm/drm_panel.h> +#include <drm/drm_print.h>
drm_print.his no longer used - drop.Quoted 121 lines
drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c new file +121
-0+ +#define DRV_NAME "panel-mantix-mlaf057we51" + +/* Manufacturer specific Commands send via DSI */ +#define MANTIX_CMD_OTP_STOP_RELOAD_MIPI 0x41 +#define MANTIX_CMD_INT_CANCEL 0x4C + +struct mantix { +struct device *dev; +struct drm_panel panel; +struct gpio_desc *reset_gpio; + +struct regulator *avdd; +struct regulator *avee; +struct regulator *vddi; +}; + +static inline struct mantix *panel_to_mantix (struct drm_panel *panel) +{ + return container_of(panel, struct mantix, panel); +} + +#define dsi_generic_write_seq(dsi, seq...) do { \ + static const u8 d[] = { seq }; \ + int ret; \ + ret = mipi_dsi_generic_write(dsi, d, ARRAY_SIZE(d)); \ + if (ret < 0) \ + return ret; \ + } while (0) + +static int mantix_init_sequence (struct mantix *ctx) +{ +struct mipi_dsi_device *dsi =to_mipi_dsi_device (ctx->dev); +struct device *dev = ctx->dev; + +/* +* Init sequence was supplied by the panel vendor. +*/ +dsi_generic_write_seq (dsi,MANTIX_CMD_OTP_STOP_RELOAD_MIPI ,0x5A ); + +dsi_generic_write_seq (dsi,MANTIX_CMD_INT_CANCEL ,0x03 ); +dsi_generic_write_seq (dsi,MANTIX_CMD_OTP_STOP_RELOAD_MIPI ,0x5A ,0x03 ); +dsi_generic_write_seq (dsi,0x80 ,0xA9 ,0x00 ); + +dsi_generic_write_seq (dsi,MANTIX_CMD_OTP_STOP_RELOAD_MIPI ,0x5A ,0x09 ); +dsi_generic_write_seq (dsi,0x80 ,0x64 ,0x00 ,0x64 ,0x00 ,0x00 ); +msleep (20 ); + +dev_dbg (dev,"Panel init sequence done\n" ); +return 0 ; +} + +static int mantix_enable (struct drm_panel *panel) +{ +struct mantix *ctx =panel_to_mantix (panel); +struct device *dev = ctx->dev; +struct mipi_dsi_device *dsi =to_mipi_dsi_device (dev); +int ret; + + ret =mantix_init_sequence (ctx); +if (ret <0 ) { +dev_err (ctx->dev,"Panel init sequence failed: %d\n" , ret); +return ret; + } + + ret =mipi_dsi_dcs_exit_sleep_mode (dsi); +if (ret <0 ) { +dev_err (dev,"Failed to exit sleep mode\n" ); +return ret; + } +msleep (20 ); + + ret =mipi_dsi_dcs_set_display_on (dsi); +if (ret) +return ret; +usleep_range (10000 ,12000 ); + + ret =mipi_dsi_turn_on_peripheral (dsi); +if (ret <0 ) { +dev_err (dev,"Failed to turn on peripheral\n" ); +return ret; + } + +return 0 ; +} + +static int mantix_disable (struct drm_panel *panel) +{ +struct mantix *ctx =panel_to_mantix (panel); +struct mipi_dsi_device *dsi =to_mipi_dsi_device (ctx->dev); +int ret; + + ret =mipi_dsi_dcs_set_display_off (dsi); +if (ret <0 ) +dev_err (ctx->dev,"Failed to turn off the display: %d\n" , ret); + + ret =mipi_dsi_dcs_enter_sleep_mode (dsi); +if (ret <0 ) +dev_err (ctx->dev,"Failed to enter sleep mode: %d\n" , ret); + + +return 0 ; +} + +static int mantix_unprepare (struct drm_panel *panel) +{ +struct mantix *ctx =panel_to_mantix (panel); + +regulator_disable (ctx->avee); +regulator_disable (ctx->avdd); +/* T11 */ +usleep_range (5000 ,6000 ); +regulator_disable (ctx->vddi); +/* T14 */ +msleep (50 ); + +return 0 ; +} + +static int mantix_prepare (struct drm_panel *panel) +{drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c line 150
Quoted 10 lines
drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c new file +10
-0+struct mantix *ctx =panel_to_mantix (panel); +int ret; + +/* Focaltech FT8006P, section 7.3.1 and 7.3.4 */ +dev_dbg (ctx->dev,"Resetting the panel\n" ); + ret =regulator_enable (ctx->vddi); +if (ret <0 ) { +dev_err (ctx->dev,"Failed to enable vddi supply: %d\n" , ret); +return ret; + }Maybe add one empty line here
Quoted 172 lines
drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c new file +172
-0+/* T1 + T2 */ +usleep_range (8000 ,10000 ); + + ret =regulator_enable (ctx->avdd); +if (ret <0 ) { +dev_err (ctx->dev,"Failed to enable avdd supply: %d\n" , ret); +return ret; + } + +/* T2d */ +usleep_range (3500 ,4000 ); + ret =regulator_enable (ctx->avee); +if (ret <0 ) { +dev_err (ctx->dev,"Failed to enable avee supply: %d\n" , ret); +return ret; + } + +/* T3+T5 */ +usleep_range (10000 ,12000 ); + +gpiod_set_value_cansleep (ctx->reset_gpio,1 ); +usleep_range (5150 ,7000 ); + +gpiod_set_value_cansleep (ctx->reset_gpio,0 ); + +/* T6 */ +msleep (50 ); + +return 0 ; +} + +static const struct drm_display_mode default_mode = { + .hdisplay =720 , + .hsync_start =720 +45 , + .hsync_end =720 +45 +14 , + .htotal =720 +45 +14 +25 , + .vdisplay =1440 , + .vsync_start =1440 +130 , + .vsync_end =1440 +130 +8 , + .vtotal =1440 +130 +8 +106 , + .clock =85298 , + .flags =DRM_MODE_FLAG_NHSYNC |DRM_MODE_FLAG_NVSYNC , + .width_mm =65 , + .height_mm =130 , +}; + +static int mantix_get_modes (struct drm_panel *panel, +struct drm_connector *connector) +{ +struct mantix *ctx =panel_to_mantix (panel); +struct drm_display_mode *mode; + + mode =drm_mode_duplicate (connector->dev, &default_mode); +if (!mode) { +dev_err (ctx->dev,"Failed to add mode %ux%u@%u\n" , + default_mode.hdisplay, default_mode.vdisplay, +drm_mode_vrefresh (mode)); +return -ENOMEM ; + } + +drm_mode_set_name (mode); + + mode->type =DRM_MODE_TYPE_DRIVER |DRM_MODE_TYPE_PREFERRED ; + connector->display_info.width_mm = mode->width_mm; + connector->display_info.height_mm = mode->height_mm; +drm_mode_probed_add (connector, mode); + +return 1 ; +} + +static const struct drm_panel_funcs mantix_drm_funcs = { + .disable = mantix_disable, + .unprepare = mantix_unprepare, + .prepare = mantix_prepare, + .enable = mantix_enable, + .get_modes = mantix_get_modes, +}; + +static int mantix_probe (struct mipi_dsi_device *dsi) +{ +struct device *dev = &dsi->dev; +struct mantix *ctx; +int ret; + + ctx =devm_kzalloc (dev,sizeof (*ctx),GFP_KERNEL ); +if (!ctx) +return -ENOMEM ; + + ctx->reset_gpio =devm_gpiod_get (dev,"reset" ,GPIOD_OUT_LOW ); +if (IS_ERR (ctx->reset_gpio)) { +dev_err (dev,"cannot get reset gpio\n" ); +return PTR_ERR (ctx->reset_gpio); + } + +mipi_dsi_set_drvdata (dsi, ctx); + ctx->dev = dev; + + dsi->lanes =4 ; + dsi->format =MIPI_DSI_FMT_RGB888 ; + dsi->mode_flags =MIPI_DSI_MODE_VIDEO | +MIPI_DSI_MODE_VIDEO_BURST |MIPI_DSI_MODE_VIDEO_SYNC_PULSE ; + + ctx->avdd =devm_regulator_get (dev,"avdd" ); +if (IS_ERR (ctx->avdd)) +return dev_err_probe (dev,PTR_ERR (ctx->avdd),"Failed to request avdd regulator\n" ); + + ctx->avee =devm_regulator_get (dev,"avee" ); +if (IS_ERR (ctx->avee)) +return dev_err_probe (dev,PTR_ERR (ctx->avee),"Failed to request avee regulator\n" ); + + ctx->vddi =devm_regulator_get (dev,"vddi" ); +if (IS_ERR (ctx->vddi)) +return dev_err_probe (dev,PTR_ERR (ctx->vddi),"Failed to request vddi regulator\n" ); + +drm_panel_init (&ctx->panel, dev, &mantix_drm_funcs, +DRM_MODE_CONNECTOR_DSI ); + + ret =drm_panel_of_backlight (&ctx->panel); +if (ret) +return ret; + +drm_panel_add (&ctx->panel); + + ret =mipi_dsi_attach (dsi); +if (ret <0 ) { +dev_err (dev,"mipi_dsi_attach failed (%d). Is host ready?\n" , ret); +drm_panel_remove (&ctx->panel); +return ret; + } + +dev_info (dev,"%ux%u@%u %ubpp dsi %udl - ready\n" , + default_mode.hdisplay, default_mode.vdisplay, +drm_mode_vrefresh (&default_mode), +mipi_dsi_pixel_format_to_bpp (dsi->format), dsi->lanes); + +return 0 ; +} + +static void mantix_shutdown (struct mipi_dsi_device *dsi) +{ +struct mantix *ctx =mipi_dsi_get_drvdata (dsi); + +drm_panel_unprepare (&ctx->panel); +drm_panel_disable (&ctx->panel); +} + +static int mantix_remove (struct mipi_dsi_device *dsi) +{ +struct mantix *ctx =mipi_dsi_get_drvdata (dsi); + +mantix_shutdown (dsi); + +mipi_dsi_detach (dsi); +drm_panel_remove (&ctx->panel); + +return 0 ; +} + +static const struct of_device_id mantix_of_match[] = { + { .compatible ="mantix,mlaf057we51-x" }, + {/* sentinel */ } +}; +MODULE_DEVICE_TABLE (of, mantix_of_match); + +static struct mipi_dsi_driver mantix_driver = { + .probe = mantix_probe, + .remove = mantix_remove, + .shutdown = mantix_shutdown, + .driver = { + .name =DRV_NAME , + .of_match_table = mantix_of_match, + },
Quoted 9 lines
Quoted 8 lines
drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c new file +6
-0+}; +module_mipi_dsi_driver (mantix_driver); + +MODULE_AUTHOR ("Guido Günther <[email protected]>" ); +MODULE_DESCRIPTION ("DRM driver for Mantix MLAF057WE51-X MIPI DSI panel" ); +MODULE_LICENSE ("GPL v2" );Signature · 1 line
2.26.2
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Quoted 21 lines · Guido Günther
Hi Sam,
thanks for having a look!Quoted 6 lines · Sam Ravnborg
Hi Guido.
Quoted 3 lines · Guido Günther
The panel uses a Focaltech FT8006p, the touch part is handled by the already existing edt-ft5x06.
Quoted 8 lines
Quoted 1 line
Signed-off-by Guido Günther <[email protected]>Two small nits - otherwise looks good.
Reviewed-by Sam Ravnborg <[email protected]>I can fix while applying or you can send a new revision, but I cannot apply until drm-misc-next have seen a backmerge due to
dev_err_probe()usage.I'll send out a v3 with this fixed.
Quoted 7 lines
Quoted 2 lines
Did you have commit rights yet?
If yes, then please apply yourself.No commit rights here. So it would be great if you could apply the patches. Should I look for commit rights? I assume that means following
https://drm.pages.freedesktop.org/maintainer-tools/commit-access.html#drm-misc
I recall we discussed this before for some other driver. For a single panel it is not needed, but if you continue to be active on other parts it makes sense.
I will apply v3 when drm-misc-next is backmeged unless you tell me otherwise. And ping me if I forgets.
Sam
Guido Günther
maintainerHi Sam,
Quoted 25 lines · Sam Ravnborg
Quoted 24 lines · Guido Günther
Hi Sam,
thanks for having a look!Quoted 6 lines · Sam Ravnborg
Hi Guido.
Quoted 3 lines · Guido Günther
The panel uses a Focaltech FT8006p, the touch part is handled by the already existing edt-ft5x06.
Quoted 8 lines
Quoted 1 line
Signed-off-by Guido Günther <[email protected]>Two small nits - otherwise looks good.
Reviewed-by Sam Ravnborg <[email protected]>I can fix while applying or you can send a new revision, but I cannot apply until drm-misc-next have seen a backmerge due to
dev_err_probe()usage.I'll send out a v3 with this fixed.
Quoted 2 lines
Did you have commit rights yet?
If yes, then please apply yourself.
Quoted 7 lines
Quoted 4 lines
No commit rights here. So it would be great if you could apply the patches. Should I look for commit rights? I assume that means following
https://drm.pages.freedesktop.org/maintainer-tools/commit-access.html#drm-misc
I recall we discussed this before for some other driver. For a single panel it is not needed, but if you continue to be active on other parts it makes sense.
I think st7703, mantix and nwl all go in via drm-misc so it might make sense. Thanks for the suggestion!
Quoted 2 lines
I will apply v3 when drm-misc-next is backmeged unless you tell me otherwise. And ping me if I forgets.
Thanks!
-- Guido
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel