(cc Dillon)
Den 03.07.2020 19.26, skrev Sam Ravnborg:
> Hi Noralf/Paul.
>
> Trying to stir up this discussion again.
>
> On Sun, Jun 14, 2020 at 06:36:22PM +0200, Noralf Trønnes wrote:
>>
>>
>> Den 07.06.2020 15.38, skrev Paul Cercueil:
>>> Hi,
>>>
>>> Here's a follow-up on the previous discussion about the current
state of
>>> DSI/DBI panel drivers, TinyDRM, and the need of a cleanup.
>>>
>>> This patchset introduces the following:
>>> * It slightly tweaks the MIPI DSI code so that it supports MIPI
DBI over
>>> various buses. This patch has been tested with a non-upstream
DRM
>>> panel driver for a ILI9331 DBI/8080 panel, written with the
DSI
>>> framework (and doesn't include <drm/drm_mipi_dbi.h>), and
non-upstream
>>> DSI/DBI host driver for the Ingenic SoCs.
>>>
>>> * A SPI DBI host driver, using the current MIPI DSI framework.
It allows
>>> MIPI DSI/DBI drivers to be written with the DSI framework,
even if
>>> they are connected over SPI, instead of registering as SPI
device
>>> drivers. Since most of these panels can be connected over
various
>>> buses, it permits to reuse the same driver independently of
the bus
>>> used.
>>>
>>> * A TinyDRM driver for DSI/DBI panels, once again independent
of the bus
>>> used; the only dependency (currently) being that the panel
must
>>> understand DCS commands.
>>>
>>> * A DRM panel driver to test the stack. This driver controls
Ilitek
>>> ILI9341 based DBI panels, like the Adafruit YX240QV29-T
320x240 2.4"
>>> TFT LCD panel. This panel was converted from
>>> drivers/gpu/drm/tiny/ili9341.c.
>>>
>>> I would like to emphasize that while it has been
compile-tested, I did
>>> not test it with real hardware since I do not have any DBI panel
>>> connected over SPI. I did runtime-test the code, just without
any panel
>>> connected.
>>>
>>> Another thing to note, is that it does not break Device Tree
ABI. The
>>> display node stays the same:
>>>
>>> display@0 {
>>> compatible = "adafruit,yx240qv29", "ilitek,ili9341";
>>> reg = <0>;
>>> spi-max-frequency = <32000000>;
>>> dc-gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
>>> reset-gpios = <&gpio0 8 GPIO_ACTIVE_HIGH>;
>>> rotation = <270>;
>>> backlight = <&backlight>;
>>> };
>>>
>>> The reason it works, is that the "adafruit,yx240qv29" device is
probed
>>> on the SPI bus, so it will match with the SPI/DBI host driver.
This will
>>> in turn register the very same node with the DSI bus, and the
ILI9341
>>> DRM panel driver will probe. The driver will detect that no
controller
>>> is linked to the panel, and eventually register the DBI/DSI
TinyDRM
>>> driver.
>>>
>>> I can't stress it enough that this is a RFC, so it still has
very rough
>>> edges.
>>>
>>
>> I don't know bridge and dsi drivers so I can't comment on that,
but one
>> thing I didn't like is that the DT compatible string has to be
added to
>> 2 different modules.
>>
>> As an example, a MI0283QT panel (ILI9341) supports these
interface options:
>>
>> 1. SPI
>> Panel setup/control and framebuffer upload over SPI
>>
>> 2. SPI + DPI
>> Panel setup/control over SPI, framebuffer scanout over DPI
>>
>> 3. Parallel bus
>> Panel setup/control and framebuffer upload over parallel bus
>
> To continue the configurations we should support:
> - Panels where the chip can be configured to SPI, SPI+DPI,
Parallel bus
> (as detailed by Noralf above)
> - Panels that supports only 6800 or 8080 - connected via GPIO
pins or
> memory mapped (maybe behind some special IP to support this)
> Command set is often special.
>
> We will see a number of chips with many different types of
displays.
> So the drivers should be chip specific with configuration
depending on
> the connected display.
>
> What I hope we can find a solution for is a single file/driver
that can
> support all the relevant interface types for a chip.
> So we would end up with a single file that included the necessary
> support for ili9341 in all interface configurations with the
necessary
> support for the relevant displays.
>
> I do not know how far we are from this as I have not dived into
the
> details of any of the proposals.
In an ideal world I would have liked to see the MIPI DBI parallel
interface implemented using a new Linux parallel bus type. It could
have
drivers for gpio bitbanging and mmio in addition to other hw
specific
drivers. Now we could have a drm_mipi_dbi DRM driver that registers
as a
SPI client driver and a Parallel bus client driver. Or it can be a
component driver for the existing DRM driver on the SoC.
I had plans to do this and made a prototype, but dropped it since it
would probably require a lot of work getting in a new Linux bus
type.