* [PATCH 0/3] Support for tft displays based on ilitek,ili9488
@ 2020-06-13 14:06 ` Kamlesh Gurudasani
0 siblings, 0 replies; 15+ messages in thread
From: Kamlesh Gurudasani @ 2020-06-13 14:06 UTC (permalink / raw)
To: Rob Herring, Sam Ravnborg, Noralf Tronnes, David Airlie,
Daniel Vetter
Cc: devicetree, dri-devel, Kamlesh Gurudasani, linux-usb
The goal of this series is to get the displays based on ilitek,ili9488
working.
Eastrising,er-tft035-6 is a display based on ilitek,ili9488
Kamlesh Gurudasani (3):
dt-bindings: add vendor prefix for EastRising Technology Co.,Ltd
dt-bindings: add binding for Ilitek ili9488 based display panels
drm/tiny: add support for tft displays based on ilitek,ili9488
.../bindings/display/ilitek,ili9488.yaml | 71 ++++
.../devicetree/bindings/vendor-prefixes.yaml | 2 +
MAINTAINERS | 7 +
drivers/gpu/drm/tiny/Kconfig | 13 +
drivers/gpu/drm/tiny/Makefile | 1 +
drivers/gpu/drm/tiny/ili9488.c | 446 +++++++++++++++++++++
6 files changed, 540 insertions(+)
create mode 100644 Documentation/devicetree/bindings/display/ilitek,ili9488.yaml
create mode 100644 drivers/gpu/drm/tiny/ili9488.c
--
2.7.4
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 0/3] Support for tft displays based on ilitek,ili9488
@ 2020-06-13 14:06 ` Kamlesh Gurudasani
0 siblings, 0 replies; 15+ messages in thread
From: Kamlesh Gurudasani @ 2020-06-13 14:06 UTC (permalink / raw)
To: Rob Herring, Sam Ravnborg, Noralf Tronnes, David Airlie,
Daniel Vetter
Cc: devicetree, Kamlesh Gurudasani, linux-usb, dri-devel
The goal of this series is to get the displays based on ilitek,ili9488
working.
Eastrising,er-tft035-6 is a display based on ilitek,ili9488
Kamlesh Gurudasani (3):
dt-bindings: add vendor prefix for EastRising Technology Co.,Ltd
dt-bindings: add binding for Ilitek ili9488 based display panels
drm/tiny: add support for tft displays based on ilitek,ili9488
.../bindings/display/ilitek,ili9488.yaml | 71 ++++
.../devicetree/bindings/vendor-prefixes.yaml | 2 +
MAINTAINERS | 7 +
drivers/gpu/drm/tiny/Kconfig | 13 +
drivers/gpu/drm/tiny/Makefile | 1 +
drivers/gpu/drm/tiny/ili9488.c | 446 +++++++++++++++++++++
6 files changed, 540 insertions(+)
create mode 100644 Documentation/devicetree/bindings/display/ilitek,ili9488.yaml
create mode 100644 drivers/gpu/drm/tiny/ili9488.c
--
2.7.4
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/3] dt-bindings: add vendor prefix for EastRising Technology Co.,Ltd
2020-06-13 14:06 ` Kamlesh Gurudasani
@ 2020-06-13 14:06 ` Kamlesh Gurudasani
-1 siblings, 0 replies; 15+ messages in thread
From: Kamlesh Gurudasani @ 2020-06-13 14:06 UTC (permalink / raw)
To: Rob Herring, Sam Ravnborg, Noralf Tronnes, David Airlie,
Daniel Vetter
Cc: devicetree, dri-devel, Kamlesh Gurudasani, linux-usb
Add vendor prefix for display manufacturer company EastRising
Technology Co.,Ltd
[1]https://eastrising.en.ec21.com/
Signed-off-by: Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
---
Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml
index 7a39732..1b3d445 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.yaml
+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml
@@ -279,6 +279,8 @@ patternProperties:
description: Dyna-Image
"^ea,.*":
description: Embedded Artists AB
+ "^eastrising,.*":
+ description: EastRising Technology Co.,Ltd
"^ebs-systart,.*":
description: EBS-SYSTART GmbH
"^ebv,.*":
--
2.7.4
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 1/3] dt-bindings: add vendor prefix for EastRising Technology Co., Ltd
@ 2020-06-13 14:06 ` Kamlesh Gurudasani
0 siblings, 0 replies; 15+ messages in thread
From: Kamlesh Gurudasani @ 2020-06-13 14:06 UTC (permalink / raw)
To: Rob Herring, Sam Ravnborg, Noralf Tronnes, David Airlie,
Daniel Vetter
Cc: devicetree, Kamlesh Gurudasani, linux-usb, dri-devel
Add vendor prefix for display manufacturer company EastRising
Technology Co.,Ltd
[1]https://eastrising.en.ec21.com/
Signed-off-by: Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
---
Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml
index 7a39732..1b3d445 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.yaml
+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml
@@ -279,6 +279,8 @@ patternProperties:
description: Dyna-Image
"^ea,.*":
description: Embedded Artists AB
+ "^eastrising,.*":
+ description: EastRising Technology Co.,Ltd
"^ebs-systart,.*":
description: EBS-SYSTART GmbH
"^ebv,.*":
--
2.7.4
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/3] dt-bindings: add binding for Ilitek ili9488 based display panels
2020-06-13 14:06 ` Kamlesh Gurudasani
@ 2020-06-13 14:07 ` Kamlesh Gurudasani
-1 siblings, 0 replies; 15+ messages in thread
From: Kamlesh Gurudasani @ 2020-06-13 14:07 UTC (permalink / raw)
To: Rob Herring, Sam Ravnborg, Noralf Tronnes, David Airlie,
Daniel Vetter
Cc: devicetree, dri-devel, Kamlesh Gurudasani, linux-usb
This adds binding for ilitek,ili9488 based display panels
Signed-off-by: Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
---
.../bindings/display/ilitek,ili9488.yaml | 71 ++++++++++++++++++++++
1 file changed, 71 insertions(+)
create mode 100644 Documentation/devicetree/bindings/display/ilitek,ili9488.yaml
diff --git a/Documentation/devicetree/bindings/display/ilitek,ili9488.yaml b/Documentation/devicetree/bindings/display/ilitek,ili9488.yaml
new file mode 100644
index 0000000..61e7a63
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/ilitek,ili9488.yaml
@@ -0,0 +1,71 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/ilitek,ili9488.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Ilitek ILI9488 display panels device tree bindings
+
+maintainers:
+ - Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
+
+description:
+ This binding is for display panels using an Ilitek ILI9488 controller in SPI
+ mode.
+
+allOf:
+ - $ref: panel/panel-common.yaml#
+
+properties:
+ compatible:
+ items:
+ - enum:
+ # Eastrising 3.5" 320x480 Color TFT LCD
+ - eastrising,er-tft035-6
+ - const: ilitek,ili9488
+
+ spi-max-frequency:
+ maximum: 32000000
+
+ dc-gpios:
+ maxItems: 1
+ description: Display data/command selection (D/CX)
+
+ backlight: true
+ reg: true
+ reset-gpios: true
+ rotation: true
+
+required:
+ - compatible
+ - reg
+ - dc-gpios
+ - reset-gpios
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/gpio/gpio.h>
+
+ backlight: backlight {
+ compatible = "gpio-backlight";
+ gpios = <&gpio 22 GPIO_ACTIVE_HIGH>;
+ };
+ spi {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+
+ display@0{
+ compatible = "eastrising,er-tft035-6", "ilitek,ili9488";
+ reg = <0>;
+ spi-max-frequency = <32000000>;
+ dc-gpios = <&gpio0 24 GPIO_ACTIVE_HIGH>;
+ reset-gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>;
+ rotation = <90>;
+ backlight = <&backlight>;
+ };
+ };
+
+...
--
2.7.4
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/3] dt-bindings: add binding for Ilitek ili9488 based display panels
@ 2020-06-13 14:07 ` Kamlesh Gurudasani
0 siblings, 0 replies; 15+ messages in thread
From: Kamlesh Gurudasani @ 2020-06-13 14:07 UTC (permalink / raw)
To: Rob Herring, Sam Ravnborg, Noralf Tronnes, David Airlie,
Daniel Vetter
Cc: devicetree, Kamlesh Gurudasani, linux-usb, dri-devel
This adds binding for ilitek,ili9488 based display panels
Signed-off-by: Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
---
.../bindings/display/ilitek,ili9488.yaml | 71 ++++++++++++++++++++++
1 file changed, 71 insertions(+)
create mode 100644 Documentation/devicetree/bindings/display/ilitek,ili9488.yaml
diff --git a/Documentation/devicetree/bindings/display/ilitek,ili9488.yaml b/Documentation/devicetree/bindings/display/ilitek,ili9488.yaml
new file mode 100644
index 0000000..61e7a63
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/ilitek,ili9488.yaml
@@ -0,0 +1,71 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/ilitek,ili9488.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Ilitek ILI9488 display panels device tree bindings
+
+maintainers:
+ - Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
+
+description:
+ This binding is for display panels using an Ilitek ILI9488 controller in SPI
+ mode.
+
+allOf:
+ - $ref: panel/panel-common.yaml#
+
+properties:
+ compatible:
+ items:
+ - enum:
+ # Eastrising 3.5" 320x480 Color TFT LCD
+ - eastrising,er-tft035-6
+ - const: ilitek,ili9488
+
+ spi-max-frequency:
+ maximum: 32000000
+
+ dc-gpios:
+ maxItems: 1
+ description: Display data/command selection (D/CX)
+
+ backlight: true
+ reg: true
+ reset-gpios: true
+ rotation: true
+
+required:
+ - compatible
+ - reg
+ - dc-gpios
+ - reset-gpios
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/gpio/gpio.h>
+
+ backlight: backlight {
+ compatible = "gpio-backlight";
+ gpios = <&gpio 22 GPIO_ACTIVE_HIGH>;
+ };
+ spi {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+
+ display@0{
+ compatible = "eastrising,er-tft035-6", "ilitek,ili9488";
+ reg = <0>;
+ spi-max-frequency = <32000000>;
+ dc-gpios = <&gpio0 24 GPIO_ACTIVE_HIGH>;
+ reset-gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>;
+ rotation = <90>;
+ backlight = <&backlight>;
+ };
+ };
+
+...
--
2.7.4
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 3/3] drm/tiny: add support for tft displays based on ilitek,ili9488
2020-06-13 14:06 ` Kamlesh Gurudasani
@ 2020-06-13 14:07 ` Kamlesh Gurudasani
-1 siblings, 0 replies; 15+ messages in thread
From: Kamlesh Gurudasani @ 2020-06-13 14:07 UTC (permalink / raw)
To: Rob Herring, Sam Ravnborg, Noralf Tronnes, David Airlie,
Daniel Vetter
Cc: devicetree, dri-devel, Kamlesh Gurudasani, linux-usb
This adds support fot ilitek,ili9488 based displays with 4 wire spi
interface. In 4 wire spi mode, ili9488 only supports 18 bit per pixel.
Eastrising,er-tft035-6 is a display based on ilitek,ili9488
with 4 wire spi interface.
Signed-off-by: Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
---
MAINTAINERS | 7 +
drivers/gpu/drm/tiny/Kconfig | 13 ++
drivers/gpu/drm/tiny/Makefile | 1 +
drivers/gpu/drm/tiny/ili9488.c | 446 +++++++++++++++++++++++++++++++++++++++++
4 files changed, 467 insertions(+)
create mode 100644 drivers/gpu/drm/tiny/ili9488.c
diff --git a/MAINTAINERS b/MAINTAINERS
index d59c5d3..6b062ef 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5329,6 +5329,13 @@ T: git git://anongit.freedesktop.org/drm/drm-misc
F: Documentation/devicetree/bindings/display/ilitek,ili9486.yaml
F: drivers/gpu/drm/tiny/ili9486.c
+DRM DRIVER FOR ILITEK ILI9488 PANELS
+M: Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
+S: Maintained
+T: git git://anongit.freedesktop.org/drm/drm-misc
+F: Documentation/devicetree/bindings/display/ilitek,ili9488.yaml
+F: drivers/gpu/drm/tiny/ili9488.c
+
DRM DRIVER FOR INTEL I810 VIDEO CARDS
S: Orphan / Obsolete
F: drivers/gpu/drm/i810/
diff --git a/drivers/gpu/drm/tiny/Kconfig b/drivers/gpu/drm/tiny/Kconfig
index 2b6414f..a380a92 100644
--- a/drivers/gpu/drm/tiny/Kconfig
+++ b/drivers/gpu/drm/tiny/Kconfig
@@ -80,6 +80,19 @@ config TINYDRM_ILI9486
If M is selected the module will be called ili9486.
+config TINYDRM_ILI9488
+ tristate "DRM support for ILI9488 display panels"
+ depends on DRM && SPI
+ select DRM_KMS_HELPER
+ select DRM_KMS_CMA_HELPER
+ select DRM_MIPI_DBI
+ select BACKLIGHT_CLASS_DEVICE
+ help
+ DRM driver for the following Ilitek ILI9488 panels:
+ * ER-TFT035-6 3.5" 320x480 TFT (EastRising 3.5")
+
+ If M is selected the module will be called ili9488.
+
config TINYDRM_MI0283QT
tristate "DRM support for MI0283QT"
depends on DRM && SPI
diff --git a/drivers/gpu/drm/tiny/Makefile b/drivers/gpu/drm/tiny/Makefile
index 6ae4e9e5..3e40776 100644
--- a/drivers/gpu/drm/tiny/Makefile
+++ b/drivers/gpu/drm/tiny/Makefile
@@ -6,6 +6,7 @@ obj-$(CONFIG_TINYDRM_HX8357D) += hx8357d.o
obj-$(CONFIG_TINYDRM_ILI9225) += ili9225.o
obj-$(CONFIG_TINYDRM_ILI9341) += ili9341.o
obj-$(CONFIG_TINYDRM_ILI9486) += ili9486.o
+obj-$(CONFIG_TINYDRM_ILI9488) += ili9488.o
obj-$(CONFIG_TINYDRM_MI0283QT) += mi0283qt.o
obj-$(CONFIG_TINYDRM_REPAPER) += repaper.o
obj-$(CONFIG_TINYDRM_ST7586) += st7586.o
diff --git a/drivers/gpu/drm/tiny/ili9488.c b/drivers/gpu/drm/tiny/ili9488.c
new file mode 100644
index 0000000..db3f585
--- /dev/null
+++ b/drivers/gpu/drm/tiny/ili9488.c
@@ -0,0 +1,446 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * DRM driver for Ilitek ILI9488 panels
+ *
+ * Copyright 2020 Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
+ */
+
+#include <linux/delay.h>
+#include <linux/dma-buf.h>
+#include <linux/gpio/consumer.h>
+#include <linux/module.h>
+#include <linux/property.h>
+#include <linux/spi/spi.h>
+#include <video/mipi_display.h>
+
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_damage_helper.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fb_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_mipi_dbi.h>
+#include <drm/drm_rect.h>
+
+#define ILI9488_VCOM_CONTROL_1 0xC5
+#define ILI9488_COLUMN_ADDRESS_SET 0x2A
+#define ILI9488_PAGE_ADDRESS_SET 0x2B
+#define ILI9488_MEMORY_WRITE 0x2C
+#define ILI9488_POSITIVE_GAMMA_CORRECTION 0xE0
+#define ILI9488_NEGATIVE_GAMMA_CORRECTION 0xE1
+#define ILI9488_POWER_CONTROL_1 0xC0
+#define ILI9488_POWER_CONTROL_2 0xC1
+
+#define ILI9488_MEMORY_ACCESS_CONTROL 0x36
+#define ILI9488_COLMOD_PIXEL_FORMAT_SET 0x3A
+#define ILI9488_INTERFACE_MODE_CONTROL 0xB0
+#define ILI9488_FRAME_RATE_CONTROL_PARTIAL 0xB3
+#define ILI9488_DISPLAY_INVERSION_CONTROL 0xB4
+#define ILI9488_SET_IMAGE_FUNCTION 0xE9
+#define ILI9488_ADJUST_CONTROL_3 0xF7
+#define ILI9488_ADJUST_CONTROL_3 0xF7
+#define ILI9488_DISPLAY_ON 0x29
+#define ILI9488_DISPLAY_OFF 0x28
+#define ILI9488_ENTER_SLEEP_MODE 0x10
+#define ILI9488_DBI_BPP18 0x06
+#define ILI9488_DPI_BPP18 0x60
+#define ILI9488_FRAME_RATE_CONTROL_NORMAL 0xB1
+#define ILI9488_SLEEP_OUT 0x11
+
+#define ILI9488_MADCTL_BGR BIT(3)
+#define ILI9488_MADCTL_MV BIT(5)
+#define ILI9488_MADCTL_MX BIT(6)
+#define ILI9488_MADCTL_MY BIT(7)
+
+static void ili9488_rgb565_to_rgb666_line(u8 *dst, u16 *sbuf,
+ unsigned int pixels)
+{
+ unsigned int x;
+
+ for (x = 0; x < pixels; x++) {
+ *dst++ = ((*sbuf & 0xF800) >> 8);
+ *dst++ = ((*sbuf & 0x07E0) >> 3);
+ *dst++ = ((*sbuf & 0x001F) << 3);
+ sbuf++;
+ }
+}
+
+static void ili9488_rgb565_to_rgb666(u8 *dst, void *vaddr,
+ struct drm_framebuffer *fb,
+ struct drm_rect *rect)
+{
+ size_t linepixels = rect->x2 - rect->x1;
+ size_t src_len = linepixels * sizeof(u16);
+ size_t dst_len = linepixels * 3;
+ unsigned int y, lines = rect->y2 - rect->y1;
+ u16 *sbuf;
+
+ /*
+ * The cma memory is write-combined so reads are uncached.
+ * Speed up by fetching one line at a time.
+ */
+ sbuf = kmalloc(src_len, GFP_KERNEL);
+ if (!sbuf)
+ return;
+
+ vaddr += rect->y1 * fb->pitches[0] + rect->x1 * sizeof(u16);
+ for (y = 0; y < lines; y++) {
+ memcpy(sbuf, vaddr, src_len);
+ ili9488_rgb565_to_rgb666_line(dst, sbuf, linepixels);
+ vaddr += fb->pitches[0];
+ dst += dst_len;
+ }
+ kfree(sbuf);
+}
+
+static int ili9488_buf_copy(void *dst, struct drm_framebuffer *fb,
+ struct drm_rect *rect)
+{
+ struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
+ struct dma_buf_attachment *import_attach = cma_obj->base.import_attach;
+ struct drm_format_name_buf format_name;
+ void *src = cma_obj->vaddr;
+ int ret = 0;
+
+ if (import_attach) {
+ ret = dma_buf_begin_cpu_access(import_attach->dmabuf,
+ DMA_FROM_DEVICE);
+ if (ret)
+ return ret;
+ }
+
+ switch (fb->format->format) {
+ case DRM_FORMAT_RGB565:
+ ili9488_rgb565_to_rgb666(dst, src, fb, rect);
+ break;
+ default:
+ dev_err_once(fb->dev->dev, "Format is not supported: %s\n",
+ drm_get_format_name(fb->format->format,
+ &format_name));
+ return -EINVAL;
+ }
+
+ if (import_attach)
+ ret = dma_buf_end_cpu_access(import_attach->dmabuf,
+ DMA_FROM_DEVICE);
+ return ret;
+}
+
+static void ili9488_fb_dirty(struct drm_framebuffer *fb, struct drm_rect *rect)
+{
+ struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
+ struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(fb->dev);
+ struct mipi_dbi *dbi = &dbidev->dbi;
+ int idx, ret = 0;
+ void *tr;
+ bool full;
+ unsigned int height = rect->y2 - rect->y1;
+ unsigned int width = rect->x2 - rect->x1;
+
+ if (!dbidev->enabled)
+ return;
+
+ if (!drm_dev_enter(fb->dev, &idx))
+ return;
+
+ full = width == fb->width && height == fb->height;
+
+ DRM_DEBUG_KMS("Flushing [FB:%d] " DRM_RECT_FMT "\n", fb->base.id,
+ DRM_RECT_ARG(rect));
+
+ /* Always invoke copy buffer routine as the display supports
+ * only RGB666 format which is not implemented in DRM
+ */
+ if (!dbi->dc || !full ||
+ fb->format->format == DRM_FORMAT_RGB565) {
+ tr = dbidev->tx_buf;
+ ret = ili9488_buf_copy(dbidev->tx_buf, fb, rect);
+ if (ret)
+ goto err_msg;
+ } else {
+ tr = cma_obj->vaddr;
+ }
+
+ mipi_dbi_command(dbi, ILI9488_COLUMN_ADDRESS_SET,
+ (rect->x1 >> 8) & 0xFF, rect->x1 & 0xFF,
+ (rect->x2 >> 8) & 0xFF, (rect->x2 - 1) & 0xFF);
+
+ mipi_dbi_command(dbi, ILI9488_PAGE_ADDRESS_SET,
+ (rect->y1 >> 8) & 0xFF, rect->y1 & 0xFF,
+ (rect->y2 >> 8) & 0xFF, (rect->y2 - 1) & 0xFF);
+
+ ret = mipi_dbi_command_buf(dbi, ILI9488_MEMORY_WRITE, tr,
+ width * height * 3);
+
+ err_msg:
+ if (ret)
+ dev_err_once(fb->dev->dev, "Failed to update display %d\n", ret);
+
+ drm_dev_exit(idx);
+}
+
+static void ili9488_pipe_update(struct drm_simple_display_pipe *pipe,
+ struct drm_plane_state *old_state)
+{
+ struct drm_plane_state *state = pipe->plane.state;
+ struct drm_rect rect;
+
+ if (drm_atomic_helper_damage_merged(old_state, state, &rect))
+ ili9488_fb_dirty(state->fb, &rect);
+}
+
+static void ili9488_pipe_enable(struct drm_simple_display_pipe *pipe,
+ struct drm_crtc_state *crtc_state,
+ struct drm_plane_state *plane_state)
+{
+ struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(pipe->crtc.dev);
+ struct drm_framebuffer *fb = plane_state->fb;
+ struct mipi_dbi *dbi = &dbidev->dbi;
+ u8 addr_mode;
+ int ret, idx;
+ struct drm_rect rect = {
+ .x1 = 0,
+ .x2 = fb->width,
+ .y1 = 0,
+ .y2 = fb->height,
+ };
+
+ if (!drm_dev_enter(pipe->crtc.dev, &idx))
+ return;
+
+ DRM_DEBUG_KMS("\n");
+
+ ret = mipi_dbi_poweron_conditional_reset(dbidev);
+ if (ret < 0)
+ goto out_exit;
+ if (ret == 1)
+ goto out_enable;
+
+ mipi_dbi_command(dbi, ILI9488_POSITIVE_GAMMA_CORRECTION,
+ 0x00, 0x03, 0x09, 0x08, 0x16,
+ 0x0a, 0x3f, 0x78, 0x4c, 0x09,
+ 0x0a, 0x08, 0x16, 0x1a, 0x0f);
+
+ mipi_dbi_command(dbi, ILI9488_NEGATIVE_GAMMA_CORRECTION,
+ 0x00, 0x16, 0x19, 0x03, 0x0f,
+ 0x05, 0x32, 0x45, 0x46, 0x04,
+ 0x0e, 0x0d, 0x35, 0x37, 0x0f);
+
+ mipi_dbi_command(dbi, ILI9488_POWER_CONTROL_1, 0x17, 0x15);
+
+ mipi_dbi_command(dbi, ILI9488_POWER_CONTROL_2, 0x41);
+
+ mipi_dbi_command(dbi, ILI9488_VCOM_CONTROL_1, 0x00, 0x12, 0x80);
+
+ mipi_dbi_command(dbi, ILI9488_COLMOD_PIXEL_FORMAT_SET,
+ ILI9488_DBI_BPP18 | ILI9488_DPI_BPP18);
+
+ mipi_dbi_command(dbi, ILI9488_INTERFACE_MODE_CONTROL, 0x80);
+
+ mipi_dbi_command(dbi, ILI9488_FRAME_RATE_CONTROL_NORMAL, 0xa0);
+
+ mipi_dbi_command(dbi, ILI9488_DISPLAY_INVERSION_CONTROL, 0x02);
+
+ mipi_dbi_command(dbi, ILI9488_SET_IMAGE_FUNCTION, 0x00);
+
+ mipi_dbi_command(dbi, ILI9488_ADJUST_CONTROL_3,
+ 0xa9, 0x51, 0x2c, 0x82);
+
+ mipi_dbi_command(dbi, ILI9488_SLEEP_OUT);
+
+ msleep(120);
+
+ mipi_dbi_command(dbi, ILI9488_DISPLAY_ON);
+
+ dbidev->enabled = true;
+ ili9488_fb_dirty(fb, &rect);
+
+ out_enable:
+ switch (dbidev->rotation) {
+ default:
+ addr_mode = ILI9488_MADCTL_MX;
+ break;
+ case 90:
+ addr_mode = ILI9488_MADCTL_MV;
+ break;
+ case 180:
+ addr_mode = ILI9488_MADCTL_MY;
+ break;
+ case 270:
+ addr_mode = ILI9488_MADCTL_MV | ILI9488_MADCTL_MY |
+ ILI9488_MADCTL_MX;
+ break;
+ }
+ addr_mode |= ILI9488_MADCTL_BGR;
+ mipi_dbi_command(dbi, MIPI_DCS_SET_ADDRESS_MODE, addr_mode);
+ out_exit:
+ drm_dev_exit(idx);
+}
+
+static void ili9488_pipe_disable(struct drm_simple_display_pipe *pipe)
+{
+ struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(pipe->crtc.dev);
+
+ /*
+ * This callback is not protected by drm_dev_enter/exit since we want to
+ * turn off the display on regular driver unload. It's highly unlikely
+ * that the underlying SPI controller is gone should this be called
+ * after unplug.
+ */
+
+ DRM_DEBUG_KMS("\n");
+
+ if (!dbidev->enabled)
+ return;
+
+ mipi_dbi_command(&dbidev->dbi, MIPI_DCS_SET_DISPLAY_OFF);
+ dbidev->enabled = false;
+}
+
+static const u32 ili9488_formats[] = {
+ DRM_FORMAT_RGB565,
+};
+
+static const struct drm_simple_display_pipe_funcs ili9488_pipe_funcs = {
+ .enable = ili9488_pipe_enable,
+ .disable = ili9488_pipe_disable,
+ .update = ili9488_pipe_update,
+ .prepare_fb = drm_gem_fb_simple_display_pipe_prepare_fb,
+};
+
+static const struct drm_display_mode ili9488_mode = {
+ DRM_SIMPLE_MODE(320, 480, 49, 73),
+};
+
+DEFINE_DRM_GEM_CMA_FOPS(ili9488_fops);
+
+static struct drm_driver ili9488_driver = {
+ .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
+ .fops = &ili9488_fops,
+ DRM_GEM_CMA_DRIVER_OPS_VMAP,
+ .debugfs_init = mipi_dbi_debugfs_init,
+ .name = "ili9488",
+ .desc = "Ilitek ILI9488",
+ .date = "20200607",
+ .major = 1,
+ .minor = 0,
+};
+
+static const struct of_device_id ili9488_of_match[] = {
+ { .compatible = "eastrising,er-tft035-6" },
+ { }
+};
+MODULE_DEVICE_TABLE(of, ili9488_of_match);
+
+static const struct spi_device_id ili9488_id[] = {
+ { "er-tft035-6", 0 },
+ { }
+};
+MODULE_DEVICE_TABLE(spi, ili9488_id);
+
+static int ili9488_probe(struct spi_device *spi)
+{
+ struct device *dev = &spi->dev;
+ struct mipi_dbi_dev *dbidev;
+ struct drm_device *drm;
+ struct mipi_dbi *dbi;
+ struct gpio_desc *dc;
+ u32 rotation = 0;
+ size_t bufsize;
+ int ret;
+
+ dbidev = devm_drm_dev_alloc(dev, &ili9488_driver,
+ struct mipi_dbi_dev, drm);
+ if (IS_ERR(dbidev))
+ return PTR_ERR(dbidev);
+
+ dbi = &dbidev->dbi;
+ drm = &dbidev->drm;
+
+ ret = devm_drm_dev_init(dev, drm, &ili9488_driver);
+ if (ret) {
+ kfree(dbidev);
+ return ret;
+ }
+
+ drm_mode_config_init(drm);
+
+ bufsize = ili9488_mode.vdisplay * ili9488_mode.hdisplay * 3;
+
+ dbi->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
+ if (IS_ERR(dbi->reset)) {
+ DRM_DEV_ERROR(dev, "Failed to get gpio 'reset'\n");
+ return PTR_ERR(dbi->reset);
+ }
+
+ dc = devm_gpiod_get(dev, "dc", GPIOD_OUT_LOW);
+ if (IS_ERR(dc)) {
+ DRM_DEV_ERROR(dev, "Failed to get gpio 'dc'\n");
+ return PTR_ERR(dc);
+ }
+
+ dbidev->backlight = devm_of_find_backlight(dev);
+ if (IS_ERR(dbidev->backlight))
+ return PTR_ERR(dbidev->backlight);
+
+ device_property_read_u32(dev, "rotation", &rotation);
+
+ ret = mipi_dbi_spi_init(spi, dbi, dc);
+ if (ret)
+ return ret;
+
+ dbidev->drm.mode_config.preferred_depth = 16;
+
+ ret = mipi_dbi_dev_init_with_formats(dbidev, &ili9488_pipe_funcs,
+ ili9488_formats,
+ ARRAY_SIZE(ili9488_formats),
+ &ili9488_mode, rotation, bufsize);
+ if (ret)
+ return ret;
+
+ drm_mode_config_reset(drm);
+
+ ret = drm_dev_register(drm, 0);
+ if (ret)
+ return ret;
+
+ spi_set_drvdata(spi, drm);
+
+ drm_fbdev_generic_setup(drm, 0);
+
+ return 0;
+}
+
+static int ili9488_remove(struct spi_device *spi)
+{
+ struct drm_device *drm = spi_get_drvdata(spi);
+
+ drm_dev_unplug(drm);
+ drm_atomic_helper_shutdown(drm);
+
+ return 0;
+}
+
+static void ili9488_shutdown(struct spi_device *spi)
+{
+ drm_atomic_helper_shutdown(spi_get_drvdata(spi));
+}
+
+static struct spi_driver ili9488_spi_driver = {
+ .driver = {
+ .name = "ili9488",
+ .owner = THIS_MODULE,
+ .of_match_table = ili9488_of_match,
+ },
+ .id_table = ili9488_id,
+ .probe = ili9488_probe,
+ .remove = ili9488_remove,
+ .shutdown = ili9488_shutdown,
+};
+module_spi_driver(ili9488_spi_driver);
+
+MODULE_DESCRIPTION("Ilitek ILI9488 DRM driver");
+MODULE_AUTHOR("Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>");
+MODULE_LICENSE("GPL");
--
2.7.4
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 3/3] drm/tiny: add support for tft displays based on ilitek, ili9488
@ 2020-06-13 14:07 ` Kamlesh Gurudasani
0 siblings, 0 replies; 15+ messages in thread
From: Kamlesh Gurudasani @ 2020-06-13 14:07 UTC (permalink / raw)
To: Rob Herring, Sam Ravnborg, Noralf Tronnes, David Airlie,
Daniel Vetter
Cc: devicetree, Kamlesh Gurudasani, linux-usb, dri-devel
This adds support fot ilitek,ili9488 based displays with 4 wire spi
interface. In 4 wire spi mode, ili9488 only supports 18 bit per pixel.
Eastrising,er-tft035-6 is a display based on ilitek,ili9488
with 4 wire spi interface.
Signed-off-by: Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
---
MAINTAINERS | 7 +
drivers/gpu/drm/tiny/Kconfig | 13 ++
drivers/gpu/drm/tiny/Makefile | 1 +
drivers/gpu/drm/tiny/ili9488.c | 446 +++++++++++++++++++++++++++++++++++++++++
4 files changed, 467 insertions(+)
create mode 100644 drivers/gpu/drm/tiny/ili9488.c
diff --git a/MAINTAINERS b/MAINTAINERS
index d59c5d3..6b062ef 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5329,6 +5329,13 @@ T: git git://anongit.freedesktop.org/drm/drm-misc
F: Documentation/devicetree/bindings/display/ilitek,ili9486.yaml
F: drivers/gpu/drm/tiny/ili9486.c
+DRM DRIVER FOR ILITEK ILI9488 PANELS
+M: Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
+S: Maintained
+T: git git://anongit.freedesktop.org/drm/drm-misc
+F: Documentation/devicetree/bindings/display/ilitek,ili9488.yaml
+F: drivers/gpu/drm/tiny/ili9488.c
+
DRM DRIVER FOR INTEL I810 VIDEO CARDS
S: Orphan / Obsolete
F: drivers/gpu/drm/i810/
diff --git a/drivers/gpu/drm/tiny/Kconfig b/drivers/gpu/drm/tiny/Kconfig
index 2b6414f..a380a92 100644
--- a/drivers/gpu/drm/tiny/Kconfig
+++ b/drivers/gpu/drm/tiny/Kconfig
@@ -80,6 +80,19 @@ config TINYDRM_ILI9486
If M is selected the module will be called ili9486.
+config TINYDRM_ILI9488
+ tristate "DRM support for ILI9488 display panels"
+ depends on DRM && SPI
+ select DRM_KMS_HELPER
+ select DRM_KMS_CMA_HELPER
+ select DRM_MIPI_DBI
+ select BACKLIGHT_CLASS_DEVICE
+ help
+ DRM driver for the following Ilitek ILI9488 panels:
+ * ER-TFT035-6 3.5" 320x480 TFT (EastRising 3.5")
+
+ If M is selected the module will be called ili9488.
+
config TINYDRM_MI0283QT
tristate "DRM support for MI0283QT"
depends on DRM && SPI
diff --git a/drivers/gpu/drm/tiny/Makefile b/drivers/gpu/drm/tiny/Makefile
index 6ae4e9e5..3e40776 100644
--- a/drivers/gpu/drm/tiny/Makefile
+++ b/drivers/gpu/drm/tiny/Makefile
@@ -6,6 +6,7 @@ obj-$(CONFIG_TINYDRM_HX8357D) += hx8357d.o
obj-$(CONFIG_TINYDRM_ILI9225) += ili9225.o
obj-$(CONFIG_TINYDRM_ILI9341) += ili9341.o
obj-$(CONFIG_TINYDRM_ILI9486) += ili9486.o
+obj-$(CONFIG_TINYDRM_ILI9488) += ili9488.o
obj-$(CONFIG_TINYDRM_MI0283QT) += mi0283qt.o
obj-$(CONFIG_TINYDRM_REPAPER) += repaper.o
obj-$(CONFIG_TINYDRM_ST7586) += st7586.o
diff --git a/drivers/gpu/drm/tiny/ili9488.c b/drivers/gpu/drm/tiny/ili9488.c
new file mode 100644
index 0000000..db3f585
--- /dev/null
+++ b/drivers/gpu/drm/tiny/ili9488.c
@@ -0,0 +1,446 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * DRM driver for Ilitek ILI9488 panels
+ *
+ * Copyright 2020 Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
+ */
+
+#include <linux/delay.h>
+#include <linux/dma-buf.h>
+#include <linux/gpio/consumer.h>
+#include <linux/module.h>
+#include <linux/property.h>
+#include <linux/spi/spi.h>
+#include <video/mipi_display.h>
+
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_damage_helper.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_fb_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_mipi_dbi.h>
+#include <drm/drm_rect.h>
+
+#define ILI9488_VCOM_CONTROL_1 0xC5
+#define ILI9488_COLUMN_ADDRESS_SET 0x2A
+#define ILI9488_PAGE_ADDRESS_SET 0x2B
+#define ILI9488_MEMORY_WRITE 0x2C
+#define ILI9488_POSITIVE_GAMMA_CORRECTION 0xE0
+#define ILI9488_NEGATIVE_GAMMA_CORRECTION 0xE1
+#define ILI9488_POWER_CONTROL_1 0xC0
+#define ILI9488_POWER_CONTROL_2 0xC1
+
+#define ILI9488_MEMORY_ACCESS_CONTROL 0x36
+#define ILI9488_COLMOD_PIXEL_FORMAT_SET 0x3A
+#define ILI9488_INTERFACE_MODE_CONTROL 0xB0
+#define ILI9488_FRAME_RATE_CONTROL_PARTIAL 0xB3
+#define ILI9488_DISPLAY_INVERSION_CONTROL 0xB4
+#define ILI9488_SET_IMAGE_FUNCTION 0xE9
+#define ILI9488_ADJUST_CONTROL_3 0xF7
+#define ILI9488_ADJUST_CONTROL_3 0xF7
+#define ILI9488_DISPLAY_ON 0x29
+#define ILI9488_DISPLAY_OFF 0x28
+#define ILI9488_ENTER_SLEEP_MODE 0x10
+#define ILI9488_DBI_BPP18 0x06
+#define ILI9488_DPI_BPP18 0x60
+#define ILI9488_FRAME_RATE_CONTROL_NORMAL 0xB1
+#define ILI9488_SLEEP_OUT 0x11
+
+#define ILI9488_MADCTL_BGR BIT(3)
+#define ILI9488_MADCTL_MV BIT(5)
+#define ILI9488_MADCTL_MX BIT(6)
+#define ILI9488_MADCTL_MY BIT(7)
+
+static void ili9488_rgb565_to_rgb666_line(u8 *dst, u16 *sbuf,
+ unsigned int pixels)
+{
+ unsigned int x;
+
+ for (x = 0; x < pixels; x++) {
+ *dst++ = ((*sbuf & 0xF800) >> 8);
+ *dst++ = ((*sbuf & 0x07E0) >> 3);
+ *dst++ = ((*sbuf & 0x001F) << 3);
+ sbuf++;
+ }
+}
+
+static void ili9488_rgb565_to_rgb666(u8 *dst, void *vaddr,
+ struct drm_framebuffer *fb,
+ struct drm_rect *rect)
+{
+ size_t linepixels = rect->x2 - rect->x1;
+ size_t src_len = linepixels * sizeof(u16);
+ size_t dst_len = linepixels * 3;
+ unsigned int y, lines = rect->y2 - rect->y1;
+ u16 *sbuf;
+
+ /*
+ * The cma memory is write-combined so reads are uncached.
+ * Speed up by fetching one line at a time.
+ */
+ sbuf = kmalloc(src_len, GFP_KERNEL);
+ if (!sbuf)
+ return;
+
+ vaddr += rect->y1 * fb->pitches[0] + rect->x1 * sizeof(u16);
+ for (y = 0; y < lines; y++) {
+ memcpy(sbuf, vaddr, src_len);
+ ili9488_rgb565_to_rgb666_line(dst, sbuf, linepixels);
+ vaddr += fb->pitches[0];
+ dst += dst_len;
+ }
+ kfree(sbuf);
+}
+
+static int ili9488_buf_copy(void *dst, struct drm_framebuffer *fb,
+ struct drm_rect *rect)
+{
+ struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
+ struct dma_buf_attachment *import_attach = cma_obj->base.import_attach;
+ struct drm_format_name_buf format_name;
+ void *src = cma_obj->vaddr;
+ int ret = 0;
+
+ if (import_attach) {
+ ret = dma_buf_begin_cpu_access(import_attach->dmabuf,
+ DMA_FROM_DEVICE);
+ if (ret)
+ return ret;
+ }
+
+ switch (fb->format->format) {
+ case DRM_FORMAT_RGB565:
+ ili9488_rgb565_to_rgb666(dst, src, fb, rect);
+ break;
+ default:
+ dev_err_once(fb->dev->dev, "Format is not supported: %s\n",
+ drm_get_format_name(fb->format->format,
+ &format_name));
+ return -EINVAL;
+ }
+
+ if (import_attach)
+ ret = dma_buf_end_cpu_access(import_attach->dmabuf,
+ DMA_FROM_DEVICE);
+ return ret;
+}
+
+static void ili9488_fb_dirty(struct drm_framebuffer *fb, struct drm_rect *rect)
+{
+ struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
+ struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(fb->dev);
+ struct mipi_dbi *dbi = &dbidev->dbi;
+ int idx, ret = 0;
+ void *tr;
+ bool full;
+ unsigned int height = rect->y2 - rect->y1;
+ unsigned int width = rect->x2 - rect->x1;
+
+ if (!dbidev->enabled)
+ return;
+
+ if (!drm_dev_enter(fb->dev, &idx))
+ return;
+
+ full = width == fb->width && height == fb->height;
+
+ DRM_DEBUG_KMS("Flushing [FB:%d] " DRM_RECT_FMT "\n", fb->base.id,
+ DRM_RECT_ARG(rect));
+
+ /* Always invoke copy buffer routine as the display supports
+ * only RGB666 format which is not implemented in DRM
+ */
+ if (!dbi->dc || !full ||
+ fb->format->format == DRM_FORMAT_RGB565) {
+ tr = dbidev->tx_buf;
+ ret = ili9488_buf_copy(dbidev->tx_buf, fb, rect);
+ if (ret)
+ goto err_msg;
+ } else {
+ tr = cma_obj->vaddr;
+ }
+
+ mipi_dbi_command(dbi, ILI9488_COLUMN_ADDRESS_SET,
+ (rect->x1 >> 8) & 0xFF, rect->x1 & 0xFF,
+ (rect->x2 >> 8) & 0xFF, (rect->x2 - 1) & 0xFF);
+
+ mipi_dbi_command(dbi, ILI9488_PAGE_ADDRESS_SET,
+ (rect->y1 >> 8) & 0xFF, rect->y1 & 0xFF,
+ (rect->y2 >> 8) & 0xFF, (rect->y2 - 1) & 0xFF);
+
+ ret = mipi_dbi_command_buf(dbi, ILI9488_MEMORY_WRITE, tr,
+ width * height * 3);
+
+ err_msg:
+ if (ret)
+ dev_err_once(fb->dev->dev, "Failed to update display %d\n", ret);
+
+ drm_dev_exit(idx);
+}
+
+static void ili9488_pipe_update(struct drm_simple_display_pipe *pipe,
+ struct drm_plane_state *old_state)
+{
+ struct drm_plane_state *state = pipe->plane.state;
+ struct drm_rect rect;
+
+ if (drm_atomic_helper_damage_merged(old_state, state, &rect))
+ ili9488_fb_dirty(state->fb, &rect);
+}
+
+static void ili9488_pipe_enable(struct drm_simple_display_pipe *pipe,
+ struct drm_crtc_state *crtc_state,
+ struct drm_plane_state *plane_state)
+{
+ struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(pipe->crtc.dev);
+ struct drm_framebuffer *fb = plane_state->fb;
+ struct mipi_dbi *dbi = &dbidev->dbi;
+ u8 addr_mode;
+ int ret, idx;
+ struct drm_rect rect = {
+ .x1 = 0,
+ .x2 = fb->width,
+ .y1 = 0,
+ .y2 = fb->height,
+ };
+
+ if (!drm_dev_enter(pipe->crtc.dev, &idx))
+ return;
+
+ DRM_DEBUG_KMS("\n");
+
+ ret = mipi_dbi_poweron_conditional_reset(dbidev);
+ if (ret < 0)
+ goto out_exit;
+ if (ret == 1)
+ goto out_enable;
+
+ mipi_dbi_command(dbi, ILI9488_POSITIVE_GAMMA_CORRECTION,
+ 0x00, 0x03, 0x09, 0x08, 0x16,
+ 0x0a, 0x3f, 0x78, 0x4c, 0x09,
+ 0x0a, 0x08, 0x16, 0x1a, 0x0f);
+
+ mipi_dbi_command(dbi, ILI9488_NEGATIVE_GAMMA_CORRECTION,
+ 0x00, 0x16, 0x19, 0x03, 0x0f,
+ 0x05, 0x32, 0x45, 0x46, 0x04,
+ 0x0e, 0x0d, 0x35, 0x37, 0x0f);
+
+ mipi_dbi_command(dbi, ILI9488_POWER_CONTROL_1, 0x17, 0x15);
+
+ mipi_dbi_command(dbi, ILI9488_POWER_CONTROL_2, 0x41);
+
+ mipi_dbi_command(dbi, ILI9488_VCOM_CONTROL_1, 0x00, 0x12, 0x80);
+
+ mipi_dbi_command(dbi, ILI9488_COLMOD_PIXEL_FORMAT_SET,
+ ILI9488_DBI_BPP18 | ILI9488_DPI_BPP18);
+
+ mipi_dbi_command(dbi, ILI9488_INTERFACE_MODE_CONTROL, 0x80);
+
+ mipi_dbi_command(dbi, ILI9488_FRAME_RATE_CONTROL_NORMAL, 0xa0);
+
+ mipi_dbi_command(dbi, ILI9488_DISPLAY_INVERSION_CONTROL, 0x02);
+
+ mipi_dbi_command(dbi, ILI9488_SET_IMAGE_FUNCTION, 0x00);
+
+ mipi_dbi_command(dbi, ILI9488_ADJUST_CONTROL_3,
+ 0xa9, 0x51, 0x2c, 0x82);
+
+ mipi_dbi_command(dbi, ILI9488_SLEEP_OUT);
+
+ msleep(120);
+
+ mipi_dbi_command(dbi, ILI9488_DISPLAY_ON);
+
+ dbidev->enabled = true;
+ ili9488_fb_dirty(fb, &rect);
+
+ out_enable:
+ switch (dbidev->rotation) {
+ default:
+ addr_mode = ILI9488_MADCTL_MX;
+ break;
+ case 90:
+ addr_mode = ILI9488_MADCTL_MV;
+ break;
+ case 180:
+ addr_mode = ILI9488_MADCTL_MY;
+ break;
+ case 270:
+ addr_mode = ILI9488_MADCTL_MV | ILI9488_MADCTL_MY |
+ ILI9488_MADCTL_MX;
+ break;
+ }
+ addr_mode |= ILI9488_MADCTL_BGR;
+ mipi_dbi_command(dbi, MIPI_DCS_SET_ADDRESS_MODE, addr_mode);
+ out_exit:
+ drm_dev_exit(idx);
+}
+
+static void ili9488_pipe_disable(struct drm_simple_display_pipe *pipe)
+{
+ struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(pipe->crtc.dev);
+
+ /*
+ * This callback is not protected by drm_dev_enter/exit since we want to
+ * turn off the display on regular driver unload. It's highly unlikely
+ * that the underlying SPI controller is gone should this be called
+ * after unplug.
+ */
+
+ DRM_DEBUG_KMS("\n");
+
+ if (!dbidev->enabled)
+ return;
+
+ mipi_dbi_command(&dbidev->dbi, MIPI_DCS_SET_DISPLAY_OFF);
+ dbidev->enabled = false;
+}
+
+static const u32 ili9488_formats[] = {
+ DRM_FORMAT_RGB565,
+};
+
+static const struct drm_simple_display_pipe_funcs ili9488_pipe_funcs = {
+ .enable = ili9488_pipe_enable,
+ .disable = ili9488_pipe_disable,
+ .update = ili9488_pipe_update,
+ .prepare_fb = drm_gem_fb_simple_display_pipe_prepare_fb,
+};
+
+static const struct drm_display_mode ili9488_mode = {
+ DRM_SIMPLE_MODE(320, 480, 49, 73),
+};
+
+DEFINE_DRM_GEM_CMA_FOPS(ili9488_fops);
+
+static struct drm_driver ili9488_driver = {
+ .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
+ .fops = &ili9488_fops,
+ DRM_GEM_CMA_DRIVER_OPS_VMAP,
+ .debugfs_init = mipi_dbi_debugfs_init,
+ .name = "ili9488",
+ .desc = "Ilitek ILI9488",
+ .date = "20200607",
+ .major = 1,
+ .minor = 0,
+};
+
+static const struct of_device_id ili9488_of_match[] = {
+ { .compatible = "eastrising,er-tft035-6" },
+ { }
+};
+MODULE_DEVICE_TABLE(of, ili9488_of_match);
+
+static const struct spi_device_id ili9488_id[] = {
+ { "er-tft035-6", 0 },
+ { }
+};
+MODULE_DEVICE_TABLE(spi, ili9488_id);
+
+static int ili9488_probe(struct spi_device *spi)
+{
+ struct device *dev = &spi->dev;
+ struct mipi_dbi_dev *dbidev;
+ struct drm_device *drm;
+ struct mipi_dbi *dbi;
+ struct gpio_desc *dc;
+ u32 rotation = 0;
+ size_t bufsize;
+ int ret;
+
+ dbidev = devm_drm_dev_alloc(dev, &ili9488_driver,
+ struct mipi_dbi_dev, drm);
+ if (IS_ERR(dbidev))
+ return PTR_ERR(dbidev);
+
+ dbi = &dbidev->dbi;
+ drm = &dbidev->drm;
+
+ ret = devm_drm_dev_init(dev, drm, &ili9488_driver);
+ if (ret) {
+ kfree(dbidev);
+ return ret;
+ }
+
+ drm_mode_config_init(drm);
+
+ bufsize = ili9488_mode.vdisplay * ili9488_mode.hdisplay * 3;
+
+ dbi->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
+ if (IS_ERR(dbi->reset)) {
+ DRM_DEV_ERROR(dev, "Failed to get gpio 'reset'\n");
+ return PTR_ERR(dbi->reset);
+ }
+
+ dc = devm_gpiod_get(dev, "dc", GPIOD_OUT_LOW);
+ if (IS_ERR(dc)) {
+ DRM_DEV_ERROR(dev, "Failed to get gpio 'dc'\n");
+ return PTR_ERR(dc);
+ }
+
+ dbidev->backlight = devm_of_find_backlight(dev);
+ if (IS_ERR(dbidev->backlight))
+ return PTR_ERR(dbidev->backlight);
+
+ device_property_read_u32(dev, "rotation", &rotation);
+
+ ret = mipi_dbi_spi_init(spi, dbi, dc);
+ if (ret)
+ return ret;
+
+ dbidev->drm.mode_config.preferred_depth = 16;
+
+ ret = mipi_dbi_dev_init_with_formats(dbidev, &ili9488_pipe_funcs,
+ ili9488_formats,
+ ARRAY_SIZE(ili9488_formats),
+ &ili9488_mode, rotation, bufsize);
+ if (ret)
+ return ret;
+
+ drm_mode_config_reset(drm);
+
+ ret = drm_dev_register(drm, 0);
+ if (ret)
+ return ret;
+
+ spi_set_drvdata(spi, drm);
+
+ drm_fbdev_generic_setup(drm, 0);
+
+ return 0;
+}
+
+static int ili9488_remove(struct spi_device *spi)
+{
+ struct drm_device *drm = spi_get_drvdata(spi);
+
+ drm_dev_unplug(drm);
+ drm_atomic_helper_shutdown(drm);
+
+ return 0;
+}
+
+static void ili9488_shutdown(struct spi_device *spi)
+{
+ drm_atomic_helper_shutdown(spi_get_drvdata(spi));
+}
+
+static struct spi_driver ili9488_spi_driver = {
+ .driver = {
+ .name = "ili9488",
+ .owner = THIS_MODULE,
+ .of_match_table = ili9488_of_match,
+ },
+ .id_table = ili9488_id,
+ .probe = ili9488_probe,
+ .remove = ili9488_remove,
+ .shutdown = ili9488_shutdown,
+};
+module_spi_driver(ili9488_spi_driver);
+
+MODULE_DESCRIPTION("Ilitek ILI9488 DRM driver");
+MODULE_AUTHOR("Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>");
+MODULE_LICENSE("GPL");
--
2.7.4
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 3/3] drm/tiny: add support for tft displays based on ilitek,ili9488
2020-06-13 14:07 ` [PATCH 3/3] drm/tiny: add support for tft displays based on ilitek, ili9488 Kamlesh Gurudasani
(?)
@ 2020-06-13 16:07 ` kernel test robot
-1 siblings, 0 replies; 15+ messages in thread
From: kernel test robot @ 2020-06-13 16:07 UTC (permalink / raw)
To: Kamlesh Gurudasani, Rob Herring, Sam Ravnborg, Noralf Tronnes,
David Airlie, Daniel Vetter
Cc: kbuild-all, devicetree, dri-devel, Kamlesh Gurudasani, linux-usb
[-- Attachment #1: Type: text/plain, Size: 4964 bytes --]
Hi Kamlesh,
I love your patch! Yet something to improve:
[auto build test ERROR on robh/for-next]
[also build test ERROR on drm-intel/for-linux-next linus/master v5.7 next-20200613]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Kamlesh-Gurudasani/Support-for-tft-displays-based-on-ilitek-ili9488/20200613-221019
base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
config: alpha-allyesconfig (attached as .config)
compiler: alpha-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=alpha
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>, old ones prefixed by <<):
>> drivers/gpu/drm/tiny/ili9488.c:322:2: error: 'DRM_GEM_CMA_DRIVER_OPS_VMAP' undeclared here (not in a function)
322 | DRM_GEM_CMA_DRIVER_OPS_VMAP,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/gpu/drm/tiny/ili9488.c: In function 'ili9488_probe':
>> drivers/gpu/drm/tiny/ili9488.c:354:11: error: implicit declaration of function 'devm_drm_dev_alloc'; did you mean 'drm_dev_alloc'? [-Werror=implicit-function-declaration]
354 | dbidev = devm_drm_dev_alloc(dev, &ili9488_driver,
| ^~~~~~~~~~~~~~~~~~
| drm_dev_alloc
>> drivers/gpu/drm/tiny/ili9488.c:355:9: error: expected expression before 'struct'
355 | struct mipi_dbi_dev, drm);
| ^~~~~~
cc1: some warnings being treated as errors
vim +/DRM_GEM_CMA_DRIVER_OPS_VMAP +322 drivers/gpu/drm/tiny/ili9488.c
318
319 static struct drm_driver ili9488_driver = {
320 .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
321 .fops = &ili9488_fops,
> 322 DRM_GEM_CMA_DRIVER_OPS_VMAP,
323 .debugfs_init = mipi_dbi_debugfs_init,
324 .name = "ili9488",
325 .desc = "Ilitek ILI9488",
326 .date = "20200607",
327 .major = 1,
328 .minor = 0,
329 };
330
331 static const struct of_device_id ili9488_of_match[] = {
332 { .compatible = "eastrising,er-tft035-6" },
333 { }
334 };
335 MODULE_DEVICE_TABLE(of, ili9488_of_match);
336
337 static const struct spi_device_id ili9488_id[] = {
338 { "er-tft035-6", 0 },
339 { }
340 };
341 MODULE_DEVICE_TABLE(spi, ili9488_id);
342
343 static int ili9488_probe(struct spi_device *spi)
344 {
345 struct device *dev = &spi->dev;
346 struct mipi_dbi_dev *dbidev;
347 struct drm_device *drm;
348 struct mipi_dbi *dbi;
349 struct gpio_desc *dc;
350 u32 rotation = 0;
351 size_t bufsize;
352 int ret;
353
> 354 dbidev = devm_drm_dev_alloc(dev, &ili9488_driver,
> 355 struct mipi_dbi_dev, drm);
356 if (IS_ERR(dbidev))
357 return PTR_ERR(dbidev);
358
359 dbi = &dbidev->dbi;
360 drm = &dbidev->drm;
361
362 ret = devm_drm_dev_init(dev, drm, &ili9488_driver);
363 if (ret) {
364 kfree(dbidev);
365 return ret;
366 }
367
368 drm_mode_config_init(drm);
369
370 bufsize = ili9488_mode.vdisplay * ili9488_mode.hdisplay * 3;
371
372 dbi->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
373 if (IS_ERR(dbi->reset)) {
374 DRM_DEV_ERROR(dev, "Failed to get gpio 'reset'\n");
375 return PTR_ERR(dbi->reset);
376 }
377
378 dc = devm_gpiod_get(dev, "dc", GPIOD_OUT_LOW);
379 if (IS_ERR(dc)) {
380 DRM_DEV_ERROR(dev, "Failed to get gpio 'dc'\n");
381 return PTR_ERR(dc);
382 }
383
384 dbidev->backlight = devm_of_find_backlight(dev);
385 if (IS_ERR(dbidev->backlight))
386 return PTR_ERR(dbidev->backlight);
387
388 device_property_read_u32(dev, "rotation", &rotation);
389
390 ret = mipi_dbi_spi_init(spi, dbi, dc);
391 if (ret)
392 return ret;
393
394 dbidev->drm.mode_config.preferred_depth = 16;
395
396 ret = mipi_dbi_dev_init_with_formats(dbidev, &ili9488_pipe_funcs,
397 ili9488_formats,
398 ARRAY_SIZE(ili9488_formats),
399 &ili9488_mode, rotation, bufsize);
400 if (ret)
401 return ret;
402
403 drm_mode_config_reset(drm);
404
405 ret = drm_dev_register(drm, 0);
406 if (ret)
407 return ret;
408
409 spi_set_drvdata(spi, drm);
410
411 drm_fbdev_generic_setup(drm, 0);
412
413 return 0;
414 }
415
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 61403 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/3] drm/tiny: add support for tft displays based on ilitek,ili9488
@ 2020-06-13 16:07 ` kernel test robot
0 siblings, 0 replies; 15+ messages in thread
From: kernel test robot @ 2020-06-13 16:07 UTC (permalink / raw)
To: Kamlesh Gurudasani, Rob Herring, Sam Ravnborg, Noralf Tronnes,
David Airlie, Daniel Vetter
Cc: devicetree, Kamlesh Gurudasani, kbuild-all, linux-usb, dri-devel
[-- Attachment #1: Type: text/plain, Size: 4964 bytes --]
Hi Kamlesh,
I love your patch! Yet something to improve:
[auto build test ERROR on robh/for-next]
[also build test ERROR on drm-intel/for-linux-next linus/master v5.7 next-20200613]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Kamlesh-Gurudasani/Support-for-tft-displays-based-on-ilitek-ili9488/20200613-221019
base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
config: alpha-allyesconfig (attached as .config)
compiler: alpha-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=alpha
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>, old ones prefixed by <<):
>> drivers/gpu/drm/tiny/ili9488.c:322:2: error: 'DRM_GEM_CMA_DRIVER_OPS_VMAP' undeclared here (not in a function)
322 | DRM_GEM_CMA_DRIVER_OPS_VMAP,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/gpu/drm/tiny/ili9488.c: In function 'ili9488_probe':
>> drivers/gpu/drm/tiny/ili9488.c:354:11: error: implicit declaration of function 'devm_drm_dev_alloc'; did you mean 'drm_dev_alloc'? [-Werror=implicit-function-declaration]
354 | dbidev = devm_drm_dev_alloc(dev, &ili9488_driver,
| ^~~~~~~~~~~~~~~~~~
| drm_dev_alloc
>> drivers/gpu/drm/tiny/ili9488.c:355:9: error: expected expression before 'struct'
355 | struct mipi_dbi_dev, drm);
| ^~~~~~
cc1: some warnings being treated as errors
vim +/DRM_GEM_CMA_DRIVER_OPS_VMAP +322 drivers/gpu/drm/tiny/ili9488.c
318
319 static struct drm_driver ili9488_driver = {
320 .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
321 .fops = &ili9488_fops,
> 322 DRM_GEM_CMA_DRIVER_OPS_VMAP,
323 .debugfs_init = mipi_dbi_debugfs_init,
324 .name = "ili9488",
325 .desc = "Ilitek ILI9488",
326 .date = "20200607",
327 .major = 1,
328 .minor = 0,
329 };
330
331 static const struct of_device_id ili9488_of_match[] = {
332 { .compatible = "eastrising,er-tft035-6" },
333 { }
334 };
335 MODULE_DEVICE_TABLE(of, ili9488_of_match);
336
337 static const struct spi_device_id ili9488_id[] = {
338 { "er-tft035-6", 0 },
339 { }
340 };
341 MODULE_DEVICE_TABLE(spi, ili9488_id);
342
343 static int ili9488_probe(struct spi_device *spi)
344 {
345 struct device *dev = &spi->dev;
346 struct mipi_dbi_dev *dbidev;
347 struct drm_device *drm;
348 struct mipi_dbi *dbi;
349 struct gpio_desc *dc;
350 u32 rotation = 0;
351 size_t bufsize;
352 int ret;
353
> 354 dbidev = devm_drm_dev_alloc(dev, &ili9488_driver,
> 355 struct mipi_dbi_dev, drm);
356 if (IS_ERR(dbidev))
357 return PTR_ERR(dbidev);
358
359 dbi = &dbidev->dbi;
360 drm = &dbidev->drm;
361
362 ret = devm_drm_dev_init(dev, drm, &ili9488_driver);
363 if (ret) {
364 kfree(dbidev);
365 return ret;
366 }
367
368 drm_mode_config_init(drm);
369
370 bufsize = ili9488_mode.vdisplay * ili9488_mode.hdisplay * 3;
371
372 dbi->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
373 if (IS_ERR(dbi->reset)) {
374 DRM_DEV_ERROR(dev, "Failed to get gpio 'reset'\n");
375 return PTR_ERR(dbi->reset);
376 }
377
378 dc = devm_gpiod_get(dev, "dc", GPIOD_OUT_LOW);
379 if (IS_ERR(dc)) {
380 DRM_DEV_ERROR(dev, "Failed to get gpio 'dc'\n");
381 return PTR_ERR(dc);
382 }
383
384 dbidev->backlight = devm_of_find_backlight(dev);
385 if (IS_ERR(dbidev->backlight))
386 return PTR_ERR(dbidev->backlight);
387
388 device_property_read_u32(dev, "rotation", &rotation);
389
390 ret = mipi_dbi_spi_init(spi, dbi, dc);
391 if (ret)
392 return ret;
393
394 dbidev->drm.mode_config.preferred_depth = 16;
395
396 ret = mipi_dbi_dev_init_with_formats(dbidev, &ili9488_pipe_funcs,
397 ili9488_formats,
398 ARRAY_SIZE(ili9488_formats),
399 &ili9488_mode, rotation, bufsize);
400 if (ret)
401 return ret;
402
403 drm_mode_config_reset(drm);
404
405 ret = drm_dev_register(drm, 0);
406 if (ret)
407 return ret;
408
409 spi_set_drvdata(spi, drm);
410
411 drm_fbdev_generic_setup(drm, 0);
412
413 return 0;
414 }
415
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 61403 bytes --]
[-- Attachment #3: Type: text/plain, Size: 160 bytes --]
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/3] drm/tiny: add support for tft displays based on ilitek, ili9488
@ 2020-06-13 16:07 ` kernel test robot
0 siblings, 0 replies; 15+ messages in thread
From: kernel test robot @ 2020-06-13 16:07 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 5108 bytes --]
Hi Kamlesh,
I love your patch! Yet something to improve:
[auto build test ERROR on robh/for-next]
[also build test ERROR on drm-intel/for-linux-next linus/master v5.7 next-20200613]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Kamlesh-Gurudasani/Support-for-tft-displays-based-on-ilitek-ili9488/20200613-221019
base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
config: alpha-allyesconfig (attached as .config)
compiler: alpha-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=alpha
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>, old ones prefixed by <<):
>> drivers/gpu/drm/tiny/ili9488.c:322:2: error: 'DRM_GEM_CMA_DRIVER_OPS_VMAP' undeclared here (not in a function)
322 | DRM_GEM_CMA_DRIVER_OPS_VMAP,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/gpu/drm/tiny/ili9488.c: In function 'ili9488_probe':
>> drivers/gpu/drm/tiny/ili9488.c:354:11: error: implicit declaration of function 'devm_drm_dev_alloc'; did you mean 'drm_dev_alloc'? [-Werror=implicit-function-declaration]
354 | dbidev = devm_drm_dev_alloc(dev, &ili9488_driver,
| ^~~~~~~~~~~~~~~~~~
| drm_dev_alloc
>> drivers/gpu/drm/tiny/ili9488.c:355:9: error: expected expression before 'struct'
355 | struct mipi_dbi_dev, drm);
| ^~~~~~
cc1: some warnings being treated as errors
vim +/DRM_GEM_CMA_DRIVER_OPS_VMAP +322 drivers/gpu/drm/tiny/ili9488.c
318
319 static struct drm_driver ili9488_driver = {
320 .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
321 .fops = &ili9488_fops,
> 322 DRM_GEM_CMA_DRIVER_OPS_VMAP,
323 .debugfs_init = mipi_dbi_debugfs_init,
324 .name = "ili9488",
325 .desc = "Ilitek ILI9488",
326 .date = "20200607",
327 .major = 1,
328 .minor = 0,
329 };
330
331 static const struct of_device_id ili9488_of_match[] = {
332 { .compatible = "eastrising,er-tft035-6" },
333 { }
334 };
335 MODULE_DEVICE_TABLE(of, ili9488_of_match);
336
337 static const struct spi_device_id ili9488_id[] = {
338 { "er-tft035-6", 0 },
339 { }
340 };
341 MODULE_DEVICE_TABLE(spi, ili9488_id);
342
343 static int ili9488_probe(struct spi_device *spi)
344 {
345 struct device *dev = &spi->dev;
346 struct mipi_dbi_dev *dbidev;
347 struct drm_device *drm;
348 struct mipi_dbi *dbi;
349 struct gpio_desc *dc;
350 u32 rotation = 0;
351 size_t bufsize;
352 int ret;
353
> 354 dbidev = devm_drm_dev_alloc(dev, &ili9488_driver,
> 355 struct mipi_dbi_dev, drm);
356 if (IS_ERR(dbidev))
357 return PTR_ERR(dbidev);
358
359 dbi = &dbidev->dbi;
360 drm = &dbidev->drm;
361
362 ret = devm_drm_dev_init(dev, drm, &ili9488_driver);
363 if (ret) {
364 kfree(dbidev);
365 return ret;
366 }
367
368 drm_mode_config_init(drm);
369
370 bufsize = ili9488_mode.vdisplay * ili9488_mode.hdisplay * 3;
371
372 dbi->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
373 if (IS_ERR(dbi->reset)) {
374 DRM_DEV_ERROR(dev, "Failed to get gpio 'reset'\n");
375 return PTR_ERR(dbi->reset);
376 }
377
378 dc = devm_gpiod_get(dev, "dc", GPIOD_OUT_LOW);
379 if (IS_ERR(dc)) {
380 DRM_DEV_ERROR(dev, "Failed to get gpio 'dc'\n");
381 return PTR_ERR(dc);
382 }
383
384 dbidev->backlight = devm_of_find_backlight(dev);
385 if (IS_ERR(dbidev->backlight))
386 return PTR_ERR(dbidev->backlight);
387
388 device_property_read_u32(dev, "rotation", &rotation);
389
390 ret = mipi_dbi_spi_init(spi, dbi, dc);
391 if (ret)
392 return ret;
393
394 dbidev->drm.mode_config.preferred_depth = 16;
395
396 ret = mipi_dbi_dev_init_with_formats(dbidev, &ili9488_pipe_funcs,
397 ili9488_formats,
398 ARRAY_SIZE(ili9488_formats),
399 &ili9488_mode, rotation, bufsize);
400 if (ret)
401 return ret;
402
403 drm_mode_config_reset(drm);
404
405 ret = drm_dev_register(drm, 0);
406 if (ret)
407 return ret;
408
409 spi_set_drvdata(spi, drm);
410
411 drm_fbdev_generic_setup(drm, 0);
412
413 return 0;
414 }
415
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 61403 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/3] dt-bindings: add vendor prefix for EastRising Technology Co., Ltd
2020-06-13 14:06 ` [PATCH 1/3] dt-bindings: add vendor prefix for EastRising Technology Co., Ltd Kamlesh Gurudasani
@ 2020-07-15 18:13 ` Rob Herring
-1 siblings, 0 replies; 15+ messages in thread
From: Rob Herring @ 2020-07-15 18:13 UTC (permalink / raw)
To: Kamlesh Gurudasani
Cc: Daniel Vetter, David Airlie, Sam Ravnborg, Rob Herring, linux-usb,
Noralf Tronnes, dri-devel, devicetree
On Sat, 13 Jun 2020 19:36:46 +0530, Kamlesh Gurudasani wrote:
> Add vendor prefix for display manufacturer company EastRising
> Technology Co.,Ltd
>
> [1]https://eastrising.en.ec21.com/
>
> Signed-off-by: Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
> ---
> Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
> 1 file changed, 2 insertions(+)
>
Acked-by: Rob Herring <robh@kernel.org>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/3] dt-bindings: add vendor prefix for EastRising Technology Co., Ltd
@ 2020-07-15 18:13 ` Rob Herring
0 siblings, 0 replies; 15+ messages in thread
From: Rob Herring @ 2020-07-15 18:13 UTC (permalink / raw)
To: Kamlesh Gurudasani
Cc: devicetree, David Airlie, linux-usb, dri-devel, Rob Herring,
Sam Ravnborg
On Sat, 13 Jun 2020 19:36:46 +0530, Kamlesh Gurudasani wrote:
> Add vendor prefix for display manufacturer company EastRising
> Technology Co.,Ltd
>
> [1]https://eastrising.en.ec21.com/
>
> Signed-off-by: Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
> ---
> Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
> 1 file changed, 2 insertions(+)
>
Acked-by: Rob Herring <robh@kernel.org>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/3] dt-bindings: add binding for Ilitek ili9488 based display panels
2020-06-13 14:07 ` Kamlesh Gurudasani
@ 2020-07-15 18:14 ` Rob Herring
-1 siblings, 0 replies; 15+ messages in thread
From: Rob Herring @ 2020-07-15 18:14 UTC (permalink / raw)
To: Kamlesh Gurudasani
Cc: linux-usb, dri-devel, Sam Ravnborg, Daniel Vetter, David Airlie,
Rob Herring, devicetree, Noralf Tronnes
On Sat, 13 Jun 2020 19:37:03 +0530, Kamlesh Gurudasani wrote:
> This adds binding for ilitek,ili9488 based display panels
>
> Signed-off-by: Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
> ---
> .../bindings/display/ilitek,ili9488.yaml | 71 ++++++++++++++++++++++
> 1 file changed, 71 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/display/ilitek,ili9488.yaml
>
Reviewed-by: Rob Herring <robh@kernel.org>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/3] dt-bindings: add binding for Ilitek ili9488 based display panels
@ 2020-07-15 18:14 ` Rob Herring
0 siblings, 0 replies; 15+ messages in thread
From: Rob Herring @ 2020-07-15 18:14 UTC (permalink / raw)
To: Kamlesh Gurudasani
Cc: devicetree, David Airlie, linux-usb, dri-devel, Rob Herring,
Sam Ravnborg
On Sat, 13 Jun 2020 19:37:03 +0530, Kamlesh Gurudasani wrote:
> This adds binding for ilitek,ili9488 based display panels
>
> Signed-off-by: Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
> ---
> .../bindings/display/ilitek,ili9488.yaml | 71 ++++++++++++++++++++++
> 1 file changed, 71 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/display/ilitek,ili9488.yaml
>
Reviewed-by: Rob Herring <robh@kernel.org>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2020-07-15 18:14 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-13 14:06 [PATCH 0/3] Support for tft displays based on ilitek,ili9488 Kamlesh Gurudasani
2020-06-13 14:06 ` Kamlesh Gurudasani
2020-06-13 14:06 ` [PATCH 1/3] dt-bindings: add vendor prefix for EastRising Technology Co.,Ltd Kamlesh Gurudasani
2020-06-13 14:06 ` [PATCH 1/3] dt-bindings: add vendor prefix for EastRising Technology Co., Ltd Kamlesh Gurudasani
2020-07-15 18:13 ` Rob Herring
2020-07-15 18:13 ` Rob Herring
2020-06-13 14:07 ` [PATCH 2/3] dt-bindings: add binding for Ilitek ili9488 based display panels Kamlesh Gurudasani
2020-06-13 14:07 ` Kamlesh Gurudasani
2020-07-15 18:14 ` Rob Herring
2020-07-15 18:14 ` Rob Herring
2020-06-13 14:07 ` [PATCH 3/3] drm/tiny: add support for tft displays based on ilitek,ili9488 Kamlesh Gurudasani
2020-06-13 14:07 ` [PATCH 3/3] drm/tiny: add support for tft displays based on ilitek, ili9488 Kamlesh Gurudasani
2020-06-13 16:07 ` [PATCH 3/3] drm/tiny: add support for tft displays based on ilitek,ili9488 kernel test robot
2020-06-13 16:07 ` [PATCH 3/3] drm/tiny: add support for tft displays based on ilitek, ili9488 kernel test robot
2020-06-13 16:07 ` [PATCH 3/3] drm/tiny: add support for tft displays based on ilitek,ili9488 kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.