drm/tiny: Add RAiO RA8875 display controller driver support
Subsystems (4)
cover drm/tiny: Add RAiO RA8875 display controller driver support
This series adds a new drm/tiny driver and matching dt-binding for the RAiO RA8875 SPI display controller. An fbtft driver for this chip currently exists at drivers/staging/fbtft/fb_ra8875.c, but fbtft is a legacy fbdev-based staging driver, and nothing in mainline DRM currently supports this controller.
This driver does not use drm_mipi_dbi. The RA8875 SPI protocol is structurally incompatible with both Type C options drm_mipi_dbi supports. Type C1 encodes command/data as a 9th bit within a 9-bit SPI word. The RA8875 uses a full prefix byte (0x80 = command write, 0x00 = data write, 0x40 = data read, 0xC0 = status read) sent as a separate 8-bit transaction. These are not the same thing and cannot be mapped to each other.
Type C3 models two transfer types via a D/CX GPIO. The RA8875 has four transfer cycle types and no D/CX pin. More critically, the GRAM write path is stateful: an MRWC register-address transaction followed by a streaming pixel pump under a single CS assertion. I thought this may be too complicated to cater towards, but please let me know if this is the correct approach.
My ER-TFTM050-3 board has RST tied NC, and VDD is a fixed supply
set via an on-board solder jumper (3.3V/5V) rather than software-controllable, so reset-gpios/vcc-supply are not implemented in either the driver or the binding. I can add both as optional properties in v2 if reviewers know of RA8875 boards that do need this.
Tested on a Raspberry Pi 3B connected over SPI to an East Rising ER-TFTM050-3, a 5" 800x480 panel driven by the RA8875.
Ran fbtest (https://git.kernel.org/pub/scm/linux/kernel/git/geert/fbtest.git) against the resulting framebuffer:
./fbtest -f /dev/fb1
Using drawops cfb16 (16 bpp packed pixels)
Available visuals:
Monochrome
Grayscale 32
Truecolor 5:6:5:0 Using visops truecolor
Running all tests
test001: PASSED
test002: PASSED
test003: PASSED
test004: PASSED
test005: PASSED
test006: PASSED
test008: PASSED
test009: PASSED
test010: PASSED
Benchmarking... 10x10 squares: 74.24 Mpixels/s Benchmarking... 20x20 squares: 152.49 Mpixels/s Benchmarking... 50x50 squares: 334.09 Mpixels/s Benchmarking... 100x100 squares: 591.46 Mpixels/s Benchmarking... 200x200 squares: 999.49 Mpixels/s
test012: PASSED
Benchmarking... R5 circles: 45.90 Mpixels/s Benchmarking... R10 circles: 98.84 Mpixels/s Benchmarking... R25 circles: 236.37 Mpixels/s Benchmarking... R50 circles: 459.98 Mpixels/s Benchmarking... R100 circles: 851.43 Mpixels/s
test013: PASSED
Adam Azuddin (2):
dt-bindings: display: panel: Add RAiO RA8875 display controller drm/tiny: Add RAiO RA8875 display controller driver
.../bindings/display/panel/raio,ra8875.yaml | 66 ++ .../devicetree/bindings/vendor-prefixes.yaml | 2 + MAINTAINERS | 6 + drivers/gpu/drm/tiny/Kconfig | 13 + drivers/gpu/drm/tiny/Makefile | 1 + drivers/gpu/drm/tiny/ra8875.c | 739 ++++++++++++++++++ 6 files changed, 827 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml create mode 100644 drivers/gpu/drm/tiny/ra8875.c
Signature · 1 line
2.55.0
PATCH 1/2 dt-bindings: display: panel: Add RAiO RA8875 display controller
The RA8875 is an SPI-connected TFT display controller by RAiO Technology Inc. It supports display resolutions of up to 800x480.
Add YAML binding schema for the RA8875 controller, along with the raio vendor prefix for RAiO Technology Inc.
--- .../bindings/display/panel/raio,ra8875.yaml | 66 +++++++++++++++++++ .../devicetree/bindings/vendor-prefixes.yaml | 2 + 2 files changed, 68 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml
Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml new file +66 -0
@@ -0,0 +1,66 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/panel/raio,ra8875.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: RAiO RA8875 Display Controller + +maintainers: + - Adam Azuddin <[email protected]> + +description: | + This binding is for display panels using an RAiO RA8875 controller + connected via SPI. + +allOf: + - $ref: panel-common.yaml# + - $ref: /schemas/spi/spi-peripheral-props.yaml# + +properties: + compatible: + const: raio,ra8875 + + reg: + maxItems: 1 + + spi-max-frequency: + maximum: 25000000 + + display-timings: + $ref: /schemas/display/panel/display-timings.yaml# + +required: + - compatible + - reg + - display-timings + +unevaluatedProperties: false + +examples: + - | + spi { + #address-cells = <1>; + #size-cells = <0>; + + ra8875: ra8875@0 { + compatible = "raio,ra8875"; + reg = <0>; + spi-max-frequency = <16000000>; + + display-timings { + native-mode = <&timing0>; + timing0: timing0 { + clock-frequency = <25000000>; + hactive = <800>; + vactive = <480>; + hfront-porch = <40>; + hsync-len = <40>; + hback-porch = <40>; + vfront-porch = <10>; + vsync-len = <10>; + vback-porch = <20>; + }; + }; + }; + };
Documentation/devicetree/bindings/vendor-prefixes.yaml +2 -0
@@ -1395,6 +1395,8 @@ patternProperties: description: Radxa "^raidsonic,.*": description: RaidSonic Technology GmbH + "^raio,.*": + description: RAiO Technology Inc. "^ralink,.*": description: Mediatek/Ralink Technology Corp. "^ramtron,.*":
Signature · 1 line
2.55.0
Re: [PATCH 1/2] dt-bindings: display: panel: Add RAiO RA8875 display controller
Quoted 4 lines · Adam Azuddin
The RA8875 is an SPI-connected TFT display controller by RAiO Technology Inc. It supports display resolutions of up to 800x480.
Add YAML binding schema for the RA8875 controller, along with
Don use "YAML binding schema". It's redundant. You add bindings.
Quoted 1 line
the raio vendor prefix for RAiO Technology Inc.
Or better drop entire sentence, not really needed.
Quoted 17 lines
Assisted-by LLMSigned-off-by Adam Azuddin <[email protected]>--- .../bindings/display/panel/raio,ra8875.yaml | 66 +++++++++++++++++++ .../devicetree/bindings/vendor-prefixes.yaml | 2 + 2 files changed, 68 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/raio,ra8875.yamlDocumentation/devicetree/bindings/display/panel/raio,ra8875.yaml new file +2
-0@@ -0,0 +1,66 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2
Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml line 12
Quoted 10 lines
Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml new file +10
-0+--- +$id: http://devicetree.org/schemas/display/panel/raio,ra8875.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: RAiO RA8875 Display Controller + +maintainers: + - Adam Azuddin <[email protected]> + +description: |
Do not need '|' unless you need to preserve formatting.
Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml line 14
Quoted 2 lines
Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml new file +2
-0+ This binding is for display panels using an RAiO RA8875 controller + connected via SPI.
Describe hardware, not the binding.
Please instruct your LLM to actually read Linux kernel documentation before making commits.
Quoted 7 lines
Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml new file +7
-0+ +allOf: + - $ref: panel-common.yaml# + - $ref: /schemas/spi/spi-peripheral-props.yaml# + +properties: + compatible:
Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml line 31
Quoted 10 lines
Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml new file +10
-0+ const: raio,ra8875 + + reg: + maxItems: 1 + + spi-max-frequency: + maximum: 25000000 + + display-timings: + $ref: /schemas/display/panel/display-timings.yaml#
This property is not needed here, you can drop, while still requiring it in the required block.
No supplies? No reset pins?
Quoted 5 lines
Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml new file +5
-0+ +required: + - compatible + - reg + - display-timings
Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml line 46
Quoted 10 lines
Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml new file +10
-0+ +unevaluatedProperties: false + +examples: + - | + spi { + #address-cells = <1>; + #size-cells = <0>; + + ra8875: ra8875@0 {
Node names should be generic. See also an explanation and list of examples (not exhaustive) in DT specification:
https://devicetree-specification.readthedocs.io/en/latest/chapter2-devicetree-basics.html#generic-names-recommendation
If you cannot find a name matching your device, please check in kernel sources for similar cases or you can grow the spec (via pull request to DT spec repo).
Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml line 49
Quoted 3 lines
Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml new file +3
-0+ compatible = "raio,ra8875"; + reg = <0>; + spi-max-frequency = <16000000>;
Best regards,
Krzysztof
PATCH 2/2 drm/tiny: Add RAiO RA8875 display controller driver
In reply to Adam AzuddinAdd a DRM tiny driver for the RAiO RA8875 SPI-connected TFT display controller. The driver supports display resolutions up to 800x480 and uses the GEM shmem helper for buffer management.
--- MAINTAINERS | 6 + drivers/gpu/drm/tiny/Kconfig | 13 + drivers/gpu/drm/tiny/Makefile | 1 + drivers/gpu/drm/tiny/ra8875.c | 739 ++++++++++++++++++++++++++++++++++ 4 files changed, 759 insertions(+) create mode 100644 drivers/gpu/drm/tiny/ra8875.c
MAINTAINERS +6 -0
@@ -8449,6 +8449,12 @@ S: Maintained F: Documentation/devicetree/bindings/display/panel/raydium,rm67191.yaml F: drivers/gpu/drm/panel/panel-raydium-rm67191.c +DRM DRIVER FOR RAIO RA8875 PANELS +M: Adam Azuddin <[email protected]> +S: Maintained +F: Documentation/devicetree/bindings/display/panel/raio,ra8875.yaml +F: drivers/gpu/drm/tiny/ra8875.c + DRM DRIVER FOR SAMSUNG DB7430 PANELS M: Linus Walleij <[email protected]> S: Maintained
drivers/gpu/drm/tiny/Kconfig +13 -0
@@ -195,6 +195,19 @@ config TINYDRM_REPAPER If M is selected the module will be called repaper. +config TINYDRM_RA8875 + tristate "DRM support for RA8875 display panels" + depends on DRM && SPI + select DRM_CLIENT_SELECTION + select DRM_KMS_HELPER + select DRM_GEM_SHMEM_HELPER + select VIDEOMODE_HELPERS + help + DRM driver for the following RAiO RA8875 based LCD panels: + * East Rising 5.00" TFT LCD (ER-TFTM070-5V4) + + If M is selected the module will be called ra8875. + config TINYDRM_SHARP_MEMORY tristate "DRM support for Sharp Memory LCD panels" depends on DRM && SPI
drivers/gpu/drm/tiny/Makefile +1 -0
@@ -14,4 +14,5 @@ obj-$(CONFIG_TINYDRM_ILI9341) += ili9341.o obj-$(CONFIG_TINYDRM_ILI9486) += ili9486.o obj-$(CONFIG_TINYDRM_MI0283QT) += mi0283qt.o obj-$(CONFIG_TINYDRM_REPAPER) += repaper.o +obj-$(CONFIG_TINYDRM_RA8875) += ra8875.o obj-$(CONFIG_TINYDRM_SHARP_MEMORY) += sharp-memory.o
drivers/gpu/drm/tiny/ra8875.c new file +739 -0
739 lines not on this page · raw message
Signature · 1 line
2.55.0
[email protected]
AI reviewRe: [PATCH 2/2] drm/tiny: Add RAiO RA8875 display controller driver
Thank you for your contribution! Sashiko AI review found 7 potential issue(s) to consider: - [High] drm/tiny: ra8875: sleep in atomic context in display update/enable paths - [High] drm/tiny…
Thank you for your contribution! Sashiko AI review found 7 potential issue(s) to consider:
- [High] drm/tiny: ra8875: sleep in atomic context in display update/enable paths
- [High] drm/tiny: ra8875: unaligned memory access in ra8875_pipe_update()
- [High] drm/tiny: ra8875: heap buffer overflow in txbuf due to unvalidated device tree videomode
- [High] drm/tiny: ra8875: DMA on stack memory via local SPI transfer buffers
- [High] drm/tiny: ra8875: Use-After-Free of txbuf due to missing drm_dev_unplug()
- [Medium] drm/tiny: ra8875: failure to chunk large SPI transfers in display update
- [Medium] drm/tiny: ra8875: silent mode validation failure inside .enable callback --
commit d7d5e9662b2beb4a2ef49392bd30bcd603e994b4
Author: Adam Azuddin <[email protected]>
drm/tiny: Add RAiO RA8875 display controller driver
Add a DRM tiny driver for the RAiO RA8875 SPI-connected TFT display controller. The driver supports display resolutions up to 800x480 and uses the GEM shmem helper for buffer management.
Quoted 5 lines
drivers/gpu/drm/tiny/ra8875.c new file +0
-0
[ ... ]
drivers/gpu/drm/tiny/ra8875.c line 186
Quoted 12 lines
drivers/gpu/drm/tiny/ra8875.c new file +12
-0+static int ra8875_write_reg (struct ra8875_device *ra8875,u8 reg,u8 val) +{ +int ret; +u8 cmd[2 ] = {0x80 , reg }; +u8 data[2 ] = {0x00 , val }; + +struct spi_transfer t_cmd = { + .tx_buf = cmd, + .len =2 , + .speed_hz =1000000 , + .cs_change =1 ,/* pull CS high after this transfer */ + };
[Severity: High]
Is it safe to use stack-allocated buffers for SPI transfers here?
The SPI subsystem often maps these buffers for DMA, and passing stack memory is forbidden in the kernel (especially with CONFIG_VMAP_STACK) because the memory might not be physically contiguous or cache-coherent. This pattern appears to repeat with the rx/tx buffers in ra8875_read_reg() and ra8875_pipe_update().
[ ... ]
Quoted 5 lines
drivers/gpu/drm/tiny/ra8875.c new file +5
-0+static int ra8875_hw_init (struct ra8875_device *ra8875, +struct drm_display_mode *mode) +{ +u8 hdwr, hndr, hstr, hpwr, vpwr; +u16 vdhr, vndr, vstr;
drivers/gpu/drm/tiny/ra8875.c line 253
Quoted 10 lines
drivers/gpu/drm/tiny/ra8875.c new file +10
-0+u8 readback; +int ret; + +/* Soft Reset Sequence */ + ret =ra8875_write_reg (ra8875,RA8875_PWRR ,RA8875_PWRR_SOFTRST ); +if (ret) { +dev_err (ra8875->drm.dev,"Soft Reset failed\n" ); +return ret; + } +usleep_range (1000 ,2000 );
[Severity: High]
Can this sleep in atomic context?
This initialization function is called from ra8875_pipe_enable(), which is invoked by the DRM core during an atomic commit. The display subsystem guidelines state that CRTC enable callbacks run in atomic context where sleeping functions like usleep_range() are forbidden and can cause system hangs or deadlocks.
[ ... ]
Quoted 7 lines
drivers/gpu/drm/tiny/ra8875.c new file +7
-0+static void ra8875_pipe_enable (struct drm_simple_display_pipe *pipe, +struct drm_crtc_state *crtc_state, +struct drm_plane_state *plane_state) +{ +struct ra8875_device *ra8875 = + container_of(pipe->crtc.dev, struct ra8875_device, drm); +struct drm_display_mode *mode = &crtc_state->mode;
drivers/gpu/drm/tiny/ra8875.c line 456
Quoted 10 lines
drivers/gpu/drm/tiny/ra8875.c new file +10
-0+int ret; + +if (mode->hdisplay %8 !=0 || mode->hsync_start %8 !=0 || + mode->hsync_end %8 !=0 || mode->htotal %8 !=0 ) { +drm_err (&ra8875->drm, +"mode timings must be 8-pixel aligned (hdisplay=%d hsync_start=%d hsync_end=%d htotal=%d)\n" , + mode->hdisplay, mode->hsync_start, mode->hsync_end, + mode->htotal); +return ; + }
[Severity: Medium]
Does checking the mode validity here leave the pipeline in an inconsistent state if it fails?
Since this returns void from the .enable callback, the DRM core cannot catch the error and will assume the CRTC is successfully enabled. Should this validation be moved to the .atomic_check callback instead, so invalid modes are gracefully rejected before the commit?
[ ... ]
Quoted 3 lines
drivers/gpu/drm/tiny/ra8875.c new file +3
-0+static void ra8875_pipe_update (struct drm_simple_display_pipe *pipe, +struct drm_plane_state *old_plane_state) +{
[ ... ]
drivers/gpu/drm/tiny/ra8875.c line 564
Quoted 7 lines
drivers/gpu/drm/tiny/ra8875.c new file +7
-0+if (ra8875_write_reg (ra8875,RA8875_CURV1 , + (damage.y1 >>8 ) &0x01 )) + goto exit; + +/* MRWC command and pixel data are sent as separate SPI messages;*/ +if (spi_write (ra8875->spi, cmd,2 )) + goto exit;
[Severity: High]
Does this spi_write() sleep in atomic context?
Similar to the hardware initialization path, the plane update callback executes in atomic context where sleeping is forbidden. Using synchronous SPI calls here could lead to kernel warnings.
drivers/gpu/drm/tiny/ra8875.c line 576
Quoted 12 lines
drivers/gpu/drm/tiny/ra8875.c new file +12
-0+ + offset = +drm_fb_clip_offset (fb->pitches[0 ], fb->format, &damage); + + txbuf[0 ] =RA8875_DATAWRITE ; +for (r =0 ; r < height; r++) { + src_row = (u16 *)(map->vaddr + offset + + r * fb->pitches[0 ]); + dst_row = (u16 *)(txbuf +1 + r * width *2 ); +for (p =0 ; p < width; p++) + dst_row[p] =swab16 (src_row[p]); + }
[Severity: High]
Will this cause an alignment fault on strict-alignment architectures?
The expression (txbuf + 1 + r * width * 2) adds an odd offset (1) to the even base address, yielding an odd byte address. Casting this to a u16 pointer and performing a 16-bit store via dst_row[p] = swab16(...) violates C alignment rules and will likely crash platforms without hardware unaligned access support.
drivers/gpu/drm/tiny/ra8875.c line 587
Quoted 11 lines
drivers/gpu/drm/tiny/ra8875.c new file +11
-0+ +memset (&t_data,0 ,sizeof (t_data)); + t_data.tx_buf = txbuf; + t_data.len =1 + height * width *2 ; + t_data.speed_hz = ra8875->spi->max_speed_hz; + +spi_message_init (&m); +spi_message_add_tail (&t_data, &m); +if (spi_sync (ra8875->spi, &m)) + goto exit; + }
[Severity: Medium]
Can this single transfer exceed the SPI controller's maximum transfer size?
This sends the entire damage region in one SPI message, which could be quite large. Many SPI controllers enforce much smaller limits (like 4096 or 65535 bytes) and spi_sync() could fail with -EINVAL. Should this be chunked similarly to the logic in ra8875_clear_screen()?
[ ... ]
Quoted 2 lines
drivers/gpu/drm/tiny/ra8875.c new file +2
-0+static int ra8875_probe (struct spi_device *spi) +{
[ ... ]
Quoted 11 lines
drivers/gpu/drm/tiny/ra8875.c new file +11
-0+ bufSize =1 +RA8875_MAX_HEIGHT *RA8875_MAX_WIDTH *2 ; + ra8875->txbuf =devm_kzalloc (&spi->dev, bufSize,GFP_KERNEL ); +if (!ra8875->txbuf) +return -ENOMEM ; + + ret =of_get_videomode (dev->of_node, &vm,OF_USE_NATIVE_MODE ); +if (ret) +return dev_err_probe (dev, ret,"Failed to get videomode\n" ); +drm_display_mode_from_videomode (&vm, &ra8875->mode); + + ra8875->mode.type =DRM_MODE_TYPE_DRIVER |DRM_MODE_TYPE_PREFERRED ;
drivers/gpu/drm/tiny/ra8875.c line 669
Quoted 10 lines
drivers/gpu/drm/tiny/ra8875.c new file +10
-0+ +drm_mode_set_name (&ra8875->mode); + ret =drmm_mode_config_init (drm); +if (ret) +return ret; + + drm->mode_config.min_width = ra8875->mode.hdisplay; + drm->mode_config.max_width = ra8875->mode.hdisplay; + drm->mode_config.min_height = ra8875->mode.vdisplay; + drm->mode_config.max_height = ra8875->mode.vdisplay;
[Severity: High]
Could this result in an out-of-bounds write to txbuf if the device tree specifies a large resolution?
The txbuf array is allocated with a fixed size based on RA8875_MAX_WIDTH and RA8875_MAX_HEIGHT. However, the display dimensions read from the device tree are not validated against these maximums. If a larger resolution is provided, the DRM core will accept larger damage clips, and ra8875_pipe_update() will overflow the txbuf allocation when writing the pixels.
[ ... ]
drivers/gpu/drm/tiny/ra8875.c line 714
Quoted 9 lines
drivers/gpu/drm/tiny/ra8875.c new file +9
-0+static void ra8875_remove (struct spi_device *spi) +{ +struct drm_device *drm =spi_get_drvdata (spi); +struct ra8875_device *ra8875 = + container_of(drm, struct ra8875_device, drm); + +drm_dev_unregister (drm); +ra8875_display_off (ra8875); +}
[Severity: High]
Does this leave the device vulnerable to a use-after-free on unbind?
Calling drm_dev_unregister() leaves dev->unplugged set to false. If the device is unbound via sysfs while userspace has the DRM file open, a subsequent display update ioctl will pass the drm_dev_enter() check in ra8875_pipe_update() and attempt to use txbuf after devres has already freed it. Should this use drm_dev_unplug() instead?
Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=2
Re: [PATCH 2/2] drm/tiny: Add RAiO RA8875 display controller driver
In reply to Adam Azuddindrivers/gpu/drm/tiny/ra8875.c line 170
Quoted 7 lines · Adam Azuddin
drivers/gpu/drm/tiny/ra8875.c new file +7
-0+static const struct drm_connector_helper_funcs ra8875_connector_helper_funcs = { + .get_modes = ra8875_connector_get_modes +}; + +static const struct of_device_id ra8875_of_match[] = { + { .compatible ="raio,ra8875" }, + {},
Drop ,. Missing space. Please look at other files how this is written, because it was a cleanup some time ago.
Review
Quoted 2 lines
(quoted diff) +2
-0+}; +
No blank line.
Quoted 1 line
+MODULE_DEVICE_TABLE(of,
ra8875_of_match);
All ID tables are placed together, just before 'struct xxx_driver'.
Quoted 7 lines
drivers/gpu/drm/tiny/ra8875.c new file +7
-0+ +static int ra8875_write_reg (struct ra8875_device *ra8875,u8 reg,u8 val) +{ +int ret; +u8 cmd[2 ] = {0x80 , reg }; +u8 data[2 ] = {0x00 , val }; +
...
Quoted 8 lines
drivers/gpu/drm/tiny/ra8875.c new file +8
-0+ +static void ra8875_display_off (struct ra8875_device *ra8875) +{ +drm_atomic_helper_shutdown (&ra8875->drm);/* calls pipe_disable above */ +} + +static const u32 ra8875_pipe_formats[] = { +DRM_FORMAT_RGB565 ,
drivers/gpu/drm/tiny/ra8875.c line 608
Quoted 10 lines
drivers/gpu/drm/tiny/ra8875.c new file +10
-0+}; + +static const struct drm_simple_display_pipe_funcs ra8875_pipe_funcs = { + .enable = ra8875_pipe_enable, + .disable = ra8875_pipe_disable, + .update = ra8875_pipe_update, +DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS , +}; + +static const struct spi_device_id ra8875_id[] = { {"ra8875" ,0 }, {} };
This is completely misformatted table. Please open other files. git grep 'struct spi_device_id'
drivers/gpu/drm/tiny/ra8875.c line 610
Quoted 2 lines
drivers/gpu/drm/tiny/ra8875.c new file +2
-0+ +MODULE_DEVICE_TABLE (spi, ra8875_id);
Best regards,
Krzysztof
Re: [PATCH 2/2] drm/tiny: Add RAiO RA8875 display controller driver
In reply to Adam AzuddinQuoted 1 line · Adam Azuddin
+#include <
linux/mod_devicetable.h>
Please don't include <linux/mod_devicetable.h>. Both of_device_id and spi_device_id are provided by <linux/spi/spi.h> already without pulling in definitions for completely unrelated busses as dependency for your driver.
Best regards
Uwe