diff mbox series

[SRU,F/raspi] overlays: Add fbtft overlay

Message ID 20220729141153.798001-1-juerg.haefliger@canonical.com
State New
Headers show
Series [SRU,F/raspi] overlays: Add fbtft overlay | expand

Commit Message

Juerg Haefliger July 29, 2022, 2:11 p.m. UTC
From: Noralf Trønnes <noralf@tronnes.org>

BugLink: https://bugs.launchpad.net/bugs/1963919

Add an overlay that provides much of the functionality that fbtft_device did.

Signed-off-by: Noralf Trønnes <noralf@tronnes.org>

(cherry picked from commit 6a4525924c43f343951c67af4963386b477938af rpi-5.15-y)
Signed-off-by: Juerg Haefliger <juerg.haefliger@canonical.com>
---
 arch/arm/boot/dts/overlays/Makefile          |   1 +
 arch/arm/boot/dts/overlays/README            | 124 ++++
 arch/arm/boot/dts/overlays/fbtft-overlay.dts | 611 +++++++++++++++++++
 3 files changed, 736 insertions(+)
 create mode 100644 arch/arm/boot/dts/overlays/fbtft-overlay.dts

Comments

Tim Gardner July 29, 2022, 2:16 p.m. UTC | #1
On 7/29/22 08:11, Juerg Haefliger wrote:
> From: Noralf Trønnes <noralf@tronnes.org>
> 
> BugLink: https://bugs.launchpad.net/bugs/1963919
> 
> Add an overlay that provides much of the functionality that fbtft_device did.
> 
> Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
> 
> (cherry picked from commit 6a4525924c43f343951c67af4963386b477938af rpi-5.15-y)
> Signed-off-by: Juerg Haefliger <juerg.haefliger@canonical.com>
> ---
>   arch/arm/boot/dts/overlays/Makefile          |   1 +
>   arch/arm/boot/dts/overlays/README            | 124 ++++
>   arch/arm/boot/dts/overlays/fbtft-overlay.dts | 611 +++++++++++++++++++
>   3 files changed, 736 insertions(+)
>   create mode 100644 arch/arm/boot/dts/overlays/fbtft-overlay.dts
> 
> diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile
> index b2c782407fe0..bfb27ab9e928 100644
> --- a/arch/arm/boot/dts/overlays/Makefile
> +++ b/arch/arm/boot/dts/overlays/Makefile
> @@ -44,6 +44,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
>   	enc28j60.dtbo \
>   	enc28j60-spi2.dtbo \
>   	exc3000.dtbo \
> +	fbtft.dtbo \
>   	fe-pi-audio.dtbo \
>   	fsm-demo.dtbo \
>   	ghost-amp.dtbo \
> diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README
> index 03fdbdbe4729..a88f0710466c 100644
> --- a/arch/arm/boot/dts/overlays/README
> +++ b/arch/arm/boot/dts/overlays/README
> @@ -805,6 +805,130 @@ Params: interrupt               GPIO used for interrupt (default 4)
>           swapxy                  Touchscreen swapped x y axis
>   
>   
> +Name:   fbtft
> +Info:   Overlay for SPI-connected displays using the fbtft drivers.
> +
> +        This overlay seeks to replace the functionality provided by fbtft_device
> +        which is now gone from the kernel.
> +
> +        Most displays from fbtft_device have been ported over.
> +        Example:
> +          dtoverlay=fbtft,spi0-0,rpi-display,reset_pin=23,dc_pin=24,led_pin=18,rotate=270
> +
> +        It is also possible to specify the controller (this will use the default
> +        init sequence in the driver).
> +        Example:
> +          dtoverlay=fbtft,spi0-0,ili9341,bgr,reset_pin=23,dc_pin=24,led_pin=18,rotate=270
> +
> +        For devices on spi1 or spi2, the interfaces should be enabled
> +        with one of the spi1-1/2/3cs and/or spi2-1/2/3cs overlays.
> +
> +        The following features of fbtft_device have not been ported over:
> +        - parallel bus is not supported
> +        - the init property which overrides the controller initialization
> +          sequence is not supported as a parameter due to memory limitations in
> +          the bootloader responsible for applying the overlay.
> +
> +        See https://github.com/notro/fbtft/wiki/FBTFT-RPI-overlays for how to
> +        create an overlay.
> +
> +Load:   dtoverlay=fbtft,<param>=<val>
> +Params:
> +        spi<n>-<m>              Configure device at spi<n>, cs<m>
> +                                (boolean, required)
> +        speed                   SPI bus speed in Hz (default 32000000)
> +        cpha                    Shifted clock phase (CPHA) mode
> +        cpol                    Inverse clock polarity (CPOL) mode
> +
> +        adafruit18              Adafruit 1.8
> +        adafruit22              Adafruit 2.2 (old)
> +        adafruit22a             Adafruit 2.2
> +        adafruit28              Adafruit 2.8
> +        adafruit13m             Adafruit 1.3 OLED
> +        admatec_c-berry28       C-Berry28
> +        dogs102                 EA DOGS102
> +        er_tftm050_2            ER-TFTM070-2
> +        er_tftm070_5            ER-TFTM070-5
> +        ew24ha0                 EW24HA0
> +        ew24ha0_9bit            EW24HA0 in 9-bit mode
> +        freetronicsoled128      Freetronics OLED128
> +        hy28a                   HY28A
> +        hy28b                   HY28B
> +        itdb28_spi              ITDB02-2.8 with SPI interface circuit
> +        mi0283qt-2              Watterott MI0283QT-2
> +        mi0283qt-9a             Watterott MI0283QT-9A
> +        nokia3310               Nokia 3310
> +        nokia3310a              Nokia 3310a
> +        nokia5110               Nokia 5110
> +        piscreen                PiScreen
> +        pitft                   Adafruit PiTFT 2.8
> +        pioled                  ILSoft OLED
> +        rpi-display             Watterott rpi-display
> +        sainsmart18             Sainsmart 1.8
> +        sainsmart32_spi         Sainsmart 3.2 with SPI interfce circuit
> +        tinylcd35               TinyLCD 3.5
> +        tm022hdh26              Tianma TM022HDH26
> +        tontec35_9481           Tontect 3.5 with ILI9481 controller
> +        tontec35_9486           Tontect 3.5 with ILI9486 controller
> +        waveshare32b            Waveshare 3.2
> +        waveshare22             Waveshare 2.2
> +
> +        bd663474                BD663474 display controller
> +        hx8340bn                HX8340BN display controller
> +        hx8347d                 HX8347D display controller
> +        hx8353d                 HX8353D display controller
> +        hx8357d                 HX8357D display controller
> +        ili9163                 ILI9163 display controller
> +        ili9320                 ILI9320 display controller
> +        ili9325                 ILI9325 display controller
> +        ili9340                 ILI9340 display controller
> +        ili9341                 ILI9341 display controller
> +        ili9481                 ILI9481 display controller
> +        ili9486                 ILI9486 display controller
> +        pcd8544                 PCD8544 display controller
> +        ra8875                  RA8875 display controller
> +        s6d02a1                 S6D02A1 display controller
> +        s6d1121                 S6D1121 display controller
> +        seps525                 SEPS525 display controller
> +        sh1106                  SH1106 display controller
> +        ssd1289                 SSD1289 display controller
> +        ssd1305                 SSD1305 display controller
> +        ssd1306                 SSD1306 display controller
> +        ssd1325                 SSD1325 display controller
> +        ssd1331                 SSD1331 display controller
> +        ssd1351                 SSD1351 display controller
> +        st7735r                 ST7735R display controller
> +        st7789v                 ST7789V display controller
> +        tls8204                 TLS8204 display controller
> +        uc1611                  UC1611 display controller
> +        uc1701                  UC1701 display controller
> +        upd161704               UPD161704 display controller
> +
> +        width                   Display width in pixels
> +        height                  Display height in pixels
> +        regwidth                Display controller register width (default is
> +                                driver specific)
> +        buswidth                Display bus interface width (default 8)
> +        debug                   Debug output level {0-7}
> +        rotate                  Display rotation {0, 90, 180, 270} (counter
> +                                clockwise). Not supported by all drivers.
> +        bgr                     Enable BGR mode (default off). Use if Red and
> +                                Blue are swapped. Not supported by all drivers.
> +        fps                     Frames per second (default 30). In effect this
> +                                states how long the driver will wait after video
> +                                memory has been changed until display update
> +                                transfer is started.
> +        txbuflen                Length of the FBTFT transmit buffer
> +                                (default 4096)
> +        startbyte               Sets the Start byte used by fb_ili9320,
> +                                fb_ili9325 and fb_hx8347d. Common value is 0x70.
> +        gamma                   String representation of Gamma Curve(s). Driver
> +                                specific. Not supported by all drivers.
> +        reset_pin               GPIO pin for RESET
> +        dc_pin                  GPIO pin for D/C
> +        led_pin                 GPIO pin for LED backlight
> +
> +
>   Name:   fe-pi-audio
>   Info:   Configures the Fe-Pi Audio Sound Card
>   Load:   dtoverlay=fe-pi-audio
> diff --git a/arch/arm/boot/dts/overlays/fbtft-overlay.dts b/arch/arm/boot/dts/overlays/fbtft-overlay.dts
> new file mode 100644
> index 000000000000..db45f8c53bcc
> --- /dev/null
> +++ b/arch/arm/boot/dts/overlays/fbtft-overlay.dts
> @@ -0,0 +1,611 @@
> +/*
> + * Device Tree overlay for fbtft drivers
> + */
> +
> +/dts-v1/;
> +/plugin/;
> +
> +/ {
> +	compatible = "brcm,bcm2835";
> +
> +	/* adafruit18 */
> +	fragment@0 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "sitronix,st7735r";
> +			spi-max-frequency = <32000000>;
> +			gamma = "02 1c 07 12 37 32 29 2d 29 25 2B 39 00 01 03 10\n03 1d 07 06 2E 2C 29 2D 2E 2E 37 3F 00 00 02 10";
> +		};
> +	};
> +
> +	/* adafruit22 */
> +	fragment@1 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "himax,hx8340bn";
> +			spi-max-frequency = <32000000>;
> +			buswidth = <9>;
> +			bgr;
> +		};
> +	};
> +
> +	/* adafruit22a */
> +	fragment@2 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9340";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* adafruit28 */
> +	fragment@3 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9341";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* adafruit13m */
> +	fragment@4 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "solomon,ssd1306";
> +			spi-max-frequency = <16000000>;
> +		};
> +	};
> +
> +	/* admatec_c-berry28 */
> +	fragment@5 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "sitronix,st7789v";
> +			spi-max-frequency = <48000000>;
> +			init = <0x01000011
> +				0x02000078
> +				0x0100003A 0x05
> +				0x010000B2 0x0C 0x0C 0x00 0x33 0x33
> +				0x010000B7 0x35
> +				0x010000C2 0x01 0xFF
> +				0x010000C3 0x17
> +				0x010000C4 0x20
> +				0x010000BB 0x17
> +				0x010000C5 0x20
> +				0x010000D0 0xA4 0xA1
> +				0x01000029>;
> +			gamma = "D0 00 14 15 13 2C 42 43 4E 09 16 14 18 21\nD0 00 14 15 13 0B 43 55 53 0C 17 14 23 20";
> +		};
> +	};
> +
> +	/* dogs102 */
> +	fragment@6 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "UltraChip,uc1701";
> +			spi-max-frequency = <8000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* er_tftm050_2 */
> +	fragment@7 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "raio,ra8875";
> +			spi-max-frequency = <5000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			width = <480>;
> +			height = <272>;
> +			bgr;
> +		};
> +	};
> +
> +	/* er_tftm070_5 */
> +	fragment@8 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "raio,ra8875";
> +			spi-max-frequency = <5000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			width = <800>;
> +			height = <480>;
> +			bgr;
> +		};
> +	};
> +
> +	/* ew24ha0 */
> +	fragment@9 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ultrachip,uc1611";
> +			spi-max-frequency = <32000000>;
> +			spi-cpha;
> +			spi-cpol;
> +		};
> +	};
> +
> +	/* ew24ha0_9bit */
> +	fragment@10 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ultrachip,uc1611";
> +			spi-max-frequency = <32000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			buswidth = <9>;
> +		};
> +	};
> +
> +	/* freetronicsoled128 */
> +	fragment@11 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "solomon,ssd1351";
> +			spi-max-frequency = <20000000>;
> +			backlight = <2>; /* FBTFT_ONBOARD_BACKLIGHT */
> +			bgr;
> +		};
> +	};
> +
> +	/* hy28a */
> +	fragment@12 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9320";
> +			spi-max-frequency = <32000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			startbyte = <0x70>;
> +			bgr;
> +		};
> +	};
> +
> +	/* hy28b */
> +	fragment@13 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9325";
> +			spi-max-frequency = <48000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			init = <0x010000e7 0x0010
> +				0x01000000 0x0001
> +				0x01000001 0x0100
> +				0x01000002 0x0700
> +				0x01000003 0x1030
> +				0x01000004 0x0000
> +				0x01000008 0x0207
> +				0x01000009 0x0000
> +				0x0100000a 0x0000
> +				0x0100000c 0x0001
> +				0x0100000d 0x0000
> +				0x0100000f 0x0000
> +				0x01000010 0x0000
> +				0x01000011 0x0007
> +				0x01000012 0x0000
> +				0x01000013 0x0000
> +				0x02000032
> +				0x01000010 0x1590
> +				0x01000011 0x0227
> +				0x02000032
> +				0x01000012 0x009c
> +				0x02000032
> +				0x01000013 0x1900
> +				0x01000029 0x0023
> +				0x0100002b 0x000e
> +				0x02000032
> +				0x01000020 0x0000
> +				0x01000021 0x0000
> +				0x02000032
> +				0x01000050 0x0000
> +				0x01000051 0x00ef
> +				0x01000052 0x0000
> +				0x01000053 0x013f
> +				0x01000060 0xa700
> +				0x01000061 0x0001
> +				0x0100006a 0x0000
> +				0x01000080 0x0000
> +				0x01000081 0x0000
> +				0x01000082 0x0000
> +				0x01000083 0x0000
> +				0x01000084 0x0000
> +				0x01000085 0x0000
> +				0x01000090 0x0010
> +				0x01000092 0x0000
> +				0x01000093 0x0003
> +				0x01000095 0x0110
> +				0x01000097 0x0000
> +				0x01000098 0x0000
> +				0x01000007 0x0133
> +				0x01000020 0x0000
> +				0x01000021 0x0000
> +				0x02000064>;
> +			startbyte = <0x70>;
> +			bgr;
> +			fps = <50>;
> +			gamma = "04 1F 4 7 7 0 7 7 6 0\n0F 00 1 7 4 0 0 0 6 7";
> +		};
> +	};
> +
> +	/* itdb28_spi */
> +	fragment@14 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9325";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* mi0283qt-2 */
> +	fragment@15 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "himax,hx8347d";
> +			spi-max-frequency = <32000000>;
> +			startbyte = <0x70>;
> +			bgr;
> +		};
> +	};
> +
> +	/* mi0283qt-9a */
> +	fragment@16 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9341";
> +			spi-max-frequency = <32000000>;
> +			buswidth = <9>;
> +			bgr;
> +		};
> +	};
> +
> +	/* nokia3310 */
> +	fragment@17 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "philips,pcd8544";
> +			spi-max-frequency = <400000>;
> +		};
> +	};
> +
> +	/* nokia3310a */
> +	fragment@18 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "teralane,tls8204";
> +			spi-max-frequency = <1000000>;
> +		};
> +	};
> +
> +	/* nokia5110 */
> +	fragment@19 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9163";
> +			spi-max-frequency = <12000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* piscreen */
> +	fragment@20 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9486";
> +			spi-max-frequency = <32000000>;
> +			regwidth = <16>;
> +			bgr;
> +		};
> +	};
> +
> +	/* pitft */
> +	fragment@21 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9340";
> +			spi-max-frequency = <32000000>;
> +			init = <0x01000001
> +				0x02000005
> +				0x01000028
> +				0x010000EF 0x03 0x80 0x02
> +				0x010000CF 0x00 0xC1 0x30
> +				0x010000ED 0x64 0x03 0x12 0x81
> +				0x010000E8 0x85 0x00 0x78
> +				0x010000CB 0x39 0x2C 0x00 0x34 0x02
> +				0x010000F7 0x20
> +				0x010000EA 0x00 0x00
> +				0x010000C0 0x23
> +				0x010000C1 0x10
> +				0x010000C5 0x3E 0x28
> +				0x010000C7 0x86
> +				0x0100003A 0x55
> +				0x010000B1 0x00 0x18
> +				0x010000B6 0x08 0x82 0x27
> +				0x010000F2 0x00
> +				0x01000026 0x01
> +				0x010000E0 0x0F 0x31 0x2B 0x0C 0x0E 0x08 0x4E 0xF1 0x37 0x07 0x10 0x03 0x0E 0x09 0x00
> +				0x010000E1 0x00 0x0E 0x14 0x03 0x11 0x07 0x31 0xC1 0x48 0x08 0x0F 0x0C 0x31 0x36 0x0F
> +				0x01000011
> +				0x02000064
> +				0x01000029
> +				0x02000014>;
> +			bgr;
> +		};
> +	};
> +
> +	/* pioled */
> +	fragment@22 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "solomon,ssd1351";
> +			spi-max-frequency = <20000000>;
> +			bgr;
> +			gamma = "0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4";
> +		};
> +	};
> +
> +	/* rpi-display */
> +	fragment@23 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9341";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* sainsmart18 */
> +	fragment@24 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "sitronix,st7735r";
> +			spi-max-frequency = <32000000>;
> +		};
> +	};
> +
> +	/* sainsmart32_spi */
> +	fragment@25 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "solomon,ssd1289";
> +			spi-max-frequency = <16000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* tinylcd35 */
> +	fragment@26 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "neosec,tinylcd";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* tm022hdh26 */
> +	fragment@27 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9341";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* tontec35_9481 - boards before 02 July 2014 */
> +	fragment@28 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9481";
> +			spi-max-frequency = <128000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			bgr;
> +		};
> +	};
> +
> +	/* tontec35_9486 - boards after 02 July 2014 */
> +	fragment@29 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9486";
> +			spi-max-frequency = <128000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			bgr;
> +		};
> +	};
> +
> +	/* waveshare32b */
> +	fragment@30 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9340";
> +			spi-max-frequency = <48000000>;
> +			init = <0x010000CB 0x39 0x2C 0x00 0x34 0x02
> +				0x010000CF 0x00 0xC1 0x30
> +				0x010000E8 0x85 0x00 0x78
> +				0x010000EA 0x00 0x00
> +				0x010000ED 0x64 0x03 0x12 0x81
> +				0x010000F7 0x20
> +				0x010000C0 0x23
> +				0x010000C1 0x10
> +				0x010000C5 0x3E 0x28
> +				0x010000C7 0x86
> +				0x01000036 0x28
> +				0x0100003A 0x55
> +				0x010000B1 0x00 0x18
> +				0x010000B6 0x08 0x82 0x27
> +				0x010000F2 0x00
> +				0x01000026 0x01
> +				0x010000E0 0x0F 0x31 0x2B 0x0C 0x0E 0x08 0x4E 0xF1 0x37 0x07 0x10 0x03 0x0E 0x09 0x00
> +				0x010000E1 0x00 0x0E 0x14 0x03 0x11 0x07 0x31 0xC1 0x48 0x08 0x0F 0x0C 0x31 0x36 0x0F
> +				0x01000011
> +				0x02000078
> +				0x01000029
> +				0x0100002C>;
> +			bgr;
> +		};
> +	};
> +
> +	/* waveshare22 */
> +	fragment@31 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "hitachi,bd663474";
> +			spi-max-frequency = <32000000>;
> +			spi-cpha;
> +			spi-cpol;
> +		};
> +	};
> +
> +	spidev_fragment: fragment@100 {
> +		target-path = "spi0/spidev@0";
> +		__overlay__ {
> +			status = "disabled";
> +		};
> +	};
> +
> +	display_fragment: fragment@101 {
> +		target = <&spi0>;
> +		__overlay__ {
> +			/* needed to avoid dtc warning */
> +			#address-cells = <1>;
> +			#size-cells = <0>;
> +
> +			status = "okay";
> +
> +			display: display@0{
> +				reg = <0>;
> +				spi-max-frequency = <32000000>;
> +				fps = <30>;
> +				buswidth = <8>;
> +			};
> +		};
> +	};
> +
> +	__overrides__ {
> +		spi0-0        = <&display_fragment>, "target:0=",<&spi0>,
> +				<&spidev_fragment>, "target-path=spi0/spidev@0",
> +				<&display>, "reg:0=0";
> +		spi0-1        = <&display_fragment>, "target:0=",<&spi0>,
> +				<&spidev_fragment>, "target-path=spi0/spidev@1",
> +				<&display>, "reg:0=1";
> +		spi1-0        = <&display_fragment>, "target:0=",<&spi1>,
> +				<&spidev_fragment>, "target-path=spi1/spidev@0",
> +				<&display>, "reg:0=0";
> +		spi1-1        = <&display_fragment>, "target:0=",<&spi1>,
> +				<&spidev_fragment>, "target-path=spi1/spidev@1",
> +				<&display>, "reg:0=1";
> +		spi1-2        = <&display_fragment>, "target:0=",<&spi1>,
> +				<&spidev_fragment>, "target-path=spi1/spidev@2",
> +				<&display>, "reg:0=2";
> +		spi2-0        = <&display_fragment>, "target:0=",<&spi2>,
> +				<&spidev_fragment>, "target-path=spi2/spidev@0",
> +				<&display>, "reg:0=0";
> +		spi2-1        = <&display_fragment>, "target:0=",<&spi2>,
> +				<&spidev_fragment>, "target-path=spi2/spidev@1",
> +				<&display>, "reg:0=1";
> +		spi2-2        = <&display_fragment>, "target:0=",<&spi2>,
> +				<&spidev_fragment>, "target-path=spi2/spidev@2",
> +				<&display>, "reg:0=2";
> +
> +		speed         = <&display>, "spi-max-frequency:0";
> +		cpha          = <&display>, "spi-cpha?";
> +		cpol          = <&display>, "spi-cpol?";
> +
> +		/* Displays */
> +		adafruit18    = <0>, "+0";
> +		adafruit22    = <0>, "+1";
> +		adafruit22a   = <0>, "+2";
> +		adafruit28    = <0>, "+3";
> +		adafruit13m   = <0>, "+4";
> +		admatec_c-berry28 = <0>, "+5";
> +		dogs102       = <0>, "+6";
> +		er_tftm050_2  = <0>, "+7";
> +		er_tftm070_5  = <0>, "+8";
> +		ew24ha0       = <0>, "+9";
> +		ew24ha0_9bit  = <0>, "+10";
> +		freetronicsoled128 = <0>, "+11";
> +		hy28a         = <0>, "+12";
> +		hy28b         = <0>, "+13";
> +		itdb28_spi    = <0>, "+14";
> +		mi0283qt-2    = <0>, "+15";
> +		mi0283qt-9a   = <0>, "+16";
> +		nokia3310     = <0>, "+17";
> +		nokia3310a    = <0>, "+18";
> +		nokia5110     = <0>, "+19";
> +		piscreen      = <0>, "+20";
> +		pitft         = <0>, "+21";
> +		pioled        = <0>, "+22";
> +		rpi-display   = <0>, "+23";
> +		sainsmart18   = <0>, "+24";
> +		sainsmart32_spi = <0>, "+25";
> +		tinylcd35     = <0>, "+26";
> +		tm022hdh26    = <0>, "+27";
> +		tontec35_9481 = <0>, "+28";
> +		tontec35_9486 = <0>, "+29";
> +		waveshare32b  = <0>, "+30";
> +		waveshare22   = <0>, "+31";
> +
> +		/* Controllers */
> +		bd663474      = <&display>, "compatible=hitachi,bd663474";
> +		hx8340bn      = <&display>, "compatible=himax,hx8340bn";
> +		hx8347d       = <&display>, "compatible=himax,hx8347d";
> +		hx8353d       = <&display>, "compatible=himax,hx8353d";
> +		hx8357d       = <&display>, "compatible=himax,hx8357d";
> +		ili9163       = <&display>, "compatible=ilitek,ili9163";
> +		ili9320       = <&display>, "compatible=ilitek,ili9320";
> +		ili9325       = <&display>, "compatible=ilitek,ili9325";
> +		ili9340       = <&display>, "compatible=ilitek,ili9340";
> +		ili9341       = <&display>, "compatible=ilitek,ili9341";
> +		ili9481       = <&display>, "compatible=ilitek,ili9481";
> +		ili9486       = <&display>, "compatible=ilitek,ili9486";
> +		pcd8544       = <&display>, "compatible=philips,pcd8544";
> +		ra8875        = <&display>, "compatible=raio,ra8875";
> +		s6d02a1       = <&display>, "compatible=samsung,s6d02a1";
> +		s6d1121       = <&display>, "compatible=samsung,s6d1121";
> +		seps525       = <&display>, "compatible=syncoam,seps525";
> +		sh1106        = <&display>, "compatible=sinowealth,sh1106";
> +		ssd1289       = <&display>, "compatible=solomon,ssd1289";
> +		ssd1305       = <&display>, "compatible=solomon,ssd1305";
> +		ssd1306       = <&display>, "compatible=solomon,ssd1306";
> +		ssd1325       = <&display>, "compatible=solomon,ssd1325";
> +		ssd1331       = <&display>, "compatible=solomon,ssd1331";
> +		ssd1351       = <&display>, "compatible=solomon,ssd1351";
> +		st7735r       = <&display>, "compatible=sitronix,st7735r";
> +		st7789v       = <&display>, "compatible=sitronix,st7789v";
> +		tls8204       = <&display>, "compatible=teralane,tls8204";
> +		uc1611        = <&display>, "compatible=ultrachip,uc1611";
> +		uc1701        = <&display>, "compatible=UltraChip,uc1701";
> +		upd161704     = <&display>, "compatible=nec,upd161704";
> +
> +		width         = <&display>, "width:0";
> +		height        = <&display>, "height:0";
> +		regwidth      = <&display>, "regwidth:0";
> +		buswidth      = <&display>, "buswidth:0";
> +		debug         = <&display>, "debug:0";
> +		rotate        = <&display>, "rotate:0";
> +		bgr           = <&display>, "bgr?";
> +		fps           = <&display>, "fps:0";
> +		txbuflen      = <&display>, "txbuflen:0";
> +		startbyte     = <&display>, "startbyte:0";
> +		gamma         = <&display>, "gamma";
> +
> +		reset_pin     = <&display>, "reset-gpios:0=", <&gpio>,
> +				<&display>, "reset-gpios:4",
> +				<&display>, "reset-gpios:8=1"; /* GPIO_ACTIVE_LOW */
> +		dc_pin        = <&display>, "dc-gpios:0=", <&gpio>,
> +				<&display>, "dc-gpios:4",
> +				<&display>, "dc-gpios:8=0"; /* GPIO_ACTIVE_HIGH */
> +		led_pin       = <&display>, "led-gpios:0=", <&gpio>,
> +				<&display>, "led-gpios:4",
> +				<&display>, "led-gpios:8=0"; /* GPIO_ACTIVE_HIGH */
> +	};
> +};
Acked-by: Tim Gardner <tim.gardner@canonical.com>

Not really reviewable.
Kleber Souza July 29, 2022, 2:21 p.m. UTC | #2
On 29.07.22 16:11, Juerg Haefliger wrote:
> From: Noralf Trønnes <noralf@tronnes.org>
> 
> BugLink: https://bugs.launchpad.net/bugs/1963919
> 
> Add an overlay that provides much of the functionality that fbtft_device did.
> 
> Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
> 
> (cherry picked from commit 6a4525924c43f343951c67af4963386b477938af rpi-5.15-y)
> Signed-off-by: Juerg Haefliger <juerg.haefliger@canonical.com>

Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>

Thanks

> ---
>   arch/arm/boot/dts/overlays/Makefile          |   1 +
>   arch/arm/boot/dts/overlays/README            | 124 ++++
>   arch/arm/boot/dts/overlays/fbtft-overlay.dts | 611 +++++++++++++++++++
>   3 files changed, 736 insertions(+)
>   create mode 100644 arch/arm/boot/dts/overlays/fbtft-overlay.dts
> 
> diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile
> index b2c782407fe0..bfb27ab9e928 100644
> --- a/arch/arm/boot/dts/overlays/Makefile
> +++ b/arch/arm/boot/dts/overlays/Makefile
> @@ -44,6 +44,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
>   	enc28j60.dtbo \
>   	enc28j60-spi2.dtbo \
>   	exc3000.dtbo \
> +	fbtft.dtbo \
>   	fe-pi-audio.dtbo \
>   	fsm-demo.dtbo \
>   	ghost-amp.dtbo \
> diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README
> index 03fdbdbe4729..a88f0710466c 100644
> --- a/arch/arm/boot/dts/overlays/README
> +++ b/arch/arm/boot/dts/overlays/README
> @@ -805,6 +805,130 @@ Params: interrupt               GPIO used for interrupt (default 4)
>           swapxy                  Touchscreen swapped x y axis
>   
>   
> +Name:   fbtft
> +Info:   Overlay for SPI-connected displays using the fbtft drivers.
> +
> +        This overlay seeks to replace the functionality provided by fbtft_device
> +        which is now gone from the kernel.
> +
> +        Most displays from fbtft_device have been ported over.
> +        Example:
> +          dtoverlay=fbtft,spi0-0,rpi-display,reset_pin=23,dc_pin=24,led_pin=18,rotate=270
> +
> +        It is also possible to specify the controller (this will use the default
> +        init sequence in the driver).
> +        Example:
> +          dtoverlay=fbtft,spi0-0,ili9341,bgr,reset_pin=23,dc_pin=24,led_pin=18,rotate=270
> +
> +        For devices on spi1 or spi2, the interfaces should be enabled
> +        with one of the spi1-1/2/3cs and/or spi2-1/2/3cs overlays.
> +
> +        The following features of fbtft_device have not been ported over:
> +        - parallel bus is not supported
> +        - the init property which overrides the controller initialization
> +          sequence is not supported as a parameter due to memory limitations in
> +          the bootloader responsible for applying the overlay.
> +
> +        See https://github.com/notro/fbtft/wiki/FBTFT-RPI-overlays for how to
> +        create an overlay.
> +
> +Load:   dtoverlay=fbtft,<param>=<val>
> +Params:
> +        spi<n>-<m>              Configure device at spi<n>, cs<m>
> +                                (boolean, required)
> +        speed                   SPI bus speed in Hz (default 32000000)
> +        cpha                    Shifted clock phase (CPHA) mode
> +        cpol                    Inverse clock polarity (CPOL) mode
> +
> +        adafruit18              Adafruit 1.8
> +        adafruit22              Adafruit 2.2 (old)
> +        adafruit22a             Adafruit 2.2
> +        adafruit28              Adafruit 2.8
> +        adafruit13m             Adafruit 1.3 OLED
> +        admatec_c-berry28       C-Berry28
> +        dogs102                 EA DOGS102
> +        er_tftm050_2            ER-TFTM070-2
> +        er_tftm070_5            ER-TFTM070-5
> +        ew24ha0                 EW24HA0
> +        ew24ha0_9bit            EW24HA0 in 9-bit mode
> +        freetronicsoled128      Freetronics OLED128
> +        hy28a                   HY28A
> +        hy28b                   HY28B
> +        itdb28_spi              ITDB02-2.8 with SPI interface circuit
> +        mi0283qt-2              Watterott MI0283QT-2
> +        mi0283qt-9a             Watterott MI0283QT-9A
> +        nokia3310               Nokia 3310
> +        nokia3310a              Nokia 3310a
> +        nokia5110               Nokia 5110
> +        piscreen                PiScreen
> +        pitft                   Adafruit PiTFT 2.8
> +        pioled                  ILSoft OLED
> +        rpi-display             Watterott rpi-display
> +        sainsmart18             Sainsmart 1.8
> +        sainsmart32_spi         Sainsmart 3.2 with SPI interfce circuit
> +        tinylcd35               TinyLCD 3.5
> +        tm022hdh26              Tianma TM022HDH26
> +        tontec35_9481           Tontect 3.5 with ILI9481 controller
> +        tontec35_9486           Tontect 3.5 with ILI9486 controller
> +        waveshare32b            Waveshare 3.2
> +        waveshare22             Waveshare 2.2
> +
> +        bd663474                BD663474 display controller
> +        hx8340bn                HX8340BN display controller
> +        hx8347d                 HX8347D display controller
> +        hx8353d                 HX8353D display controller
> +        hx8357d                 HX8357D display controller
> +        ili9163                 ILI9163 display controller
> +        ili9320                 ILI9320 display controller
> +        ili9325                 ILI9325 display controller
> +        ili9340                 ILI9340 display controller
> +        ili9341                 ILI9341 display controller
> +        ili9481                 ILI9481 display controller
> +        ili9486                 ILI9486 display controller
> +        pcd8544                 PCD8544 display controller
> +        ra8875                  RA8875 display controller
> +        s6d02a1                 S6D02A1 display controller
> +        s6d1121                 S6D1121 display controller
> +        seps525                 SEPS525 display controller
> +        sh1106                  SH1106 display controller
> +        ssd1289                 SSD1289 display controller
> +        ssd1305                 SSD1305 display controller
> +        ssd1306                 SSD1306 display controller
> +        ssd1325                 SSD1325 display controller
> +        ssd1331                 SSD1331 display controller
> +        ssd1351                 SSD1351 display controller
> +        st7735r                 ST7735R display controller
> +        st7789v                 ST7789V display controller
> +        tls8204                 TLS8204 display controller
> +        uc1611                  UC1611 display controller
> +        uc1701                  UC1701 display controller
> +        upd161704               UPD161704 display controller
> +
> +        width                   Display width in pixels
> +        height                  Display height in pixels
> +        regwidth                Display controller register width (default is
> +                                driver specific)
> +        buswidth                Display bus interface width (default 8)
> +        debug                   Debug output level {0-7}
> +        rotate                  Display rotation {0, 90, 180, 270} (counter
> +                                clockwise). Not supported by all drivers.
> +        bgr                     Enable BGR mode (default off). Use if Red and
> +                                Blue are swapped. Not supported by all drivers.
> +        fps                     Frames per second (default 30). In effect this
> +                                states how long the driver will wait after video
> +                                memory has been changed until display update
> +                                transfer is started.
> +        txbuflen                Length of the FBTFT transmit buffer
> +                                (default 4096)
> +        startbyte               Sets the Start byte used by fb_ili9320,
> +                                fb_ili9325 and fb_hx8347d. Common value is 0x70.
> +        gamma                   String representation of Gamma Curve(s). Driver
> +                                specific. Not supported by all drivers.
> +        reset_pin               GPIO pin for RESET
> +        dc_pin                  GPIO pin for D/C
> +        led_pin                 GPIO pin for LED backlight
> +
> +
>   Name:   fe-pi-audio
>   Info:   Configures the Fe-Pi Audio Sound Card
>   Load:   dtoverlay=fe-pi-audio
> diff --git a/arch/arm/boot/dts/overlays/fbtft-overlay.dts b/arch/arm/boot/dts/overlays/fbtft-overlay.dts
> new file mode 100644
> index 000000000000..db45f8c53bcc
> --- /dev/null
> +++ b/arch/arm/boot/dts/overlays/fbtft-overlay.dts
> @@ -0,0 +1,611 @@
> +/*
> + * Device Tree overlay for fbtft drivers
> + */
> +
> +/dts-v1/;
> +/plugin/;
> +
> +/ {
> +	compatible = "brcm,bcm2835";
> +
> +	/* adafruit18 */
> +	fragment@0 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "sitronix,st7735r";
> +			spi-max-frequency = <32000000>;
> +			gamma = "02 1c 07 12 37 32 29 2d 29 25 2B 39 00 01 03 10\n03 1d 07 06 2E 2C 29 2D 2E 2E 37 3F 00 00 02 10";
> +		};
> +	};
> +
> +	/* adafruit22 */
> +	fragment@1 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "himax,hx8340bn";
> +			spi-max-frequency = <32000000>;
> +			buswidth = <9>;
> +			bgr;
> +		};
> +	};
> +
> +	/* adafruit22a */
> +	fragment@2 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9340";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* adafruit28 */
> +	fragment@3 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9341";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* adafruit13m */
> +	fragment@4 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "solomon,ssd1306";
> +			spi-max-frequency = <16000000>;
> +		};
> +	};
> +
> +	/* admatec_c-berry28 */
> +	fragment@5 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "sitronix,st7789v";
> +			spi-max-frequency = <48000000>;
> +			init = <0x01000011
> +				0x02000078
> +				0x0100003A 0x05
> +				0x010000B2 0x0C 0x0C 0x00 0x33 0x33
> +				0x010000B7 0x35
> +				0x010000C2 0x01 0xFF
> +				0x010000C3 0x17
> +				0x010000C4 0x20
> +				0x010000BB 0x17
> +				0x010000C5 0x20
> +				0x010000D0 0xA4 0xA1
> +				0x01000029>;
> +			gamma = "D0 00 14 15 13 2C 42 43 4E 09 16 14 18 21\nD0 00 14 15 13 0B 43 55 53 0C 17 14 23 20";
> +		};
> +	};
> +
> +	/* dogs102 */
> +	fragment@6 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "UltraChip,uc1701";
> +			spi-max-frequency = <8000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* er_tftm050_2 */
> +	fragment@7 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "raio,ra8875";
> +			spi-max-frequency = <5000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			width = <480>;
> +			height = <272>;
> +			bgr;
> +		};
> +	};
> +
> +	/* er_tftm070_5 */
> +	fragment@8 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "raio,ra8875";
> +			spi-max-frequency = <5000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			width = <800>;
> +			height = <480>;
> +			bgr;
> +		};
> +	};
> +
> +	/* ew24ha0 */
> +	fragment@9 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ultrachip,uc1611";
> +			spi-max-frequency = <32000000>;
> +			spi-cpha;
> +			spi-cpol;
> +		};
> +	};
> +
> +	/* ew24ha0_9bit */
> +	fragment@10 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ultrachip,uc1611";
> +			spi-max-frequency = <32000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			buswidth = <9>;
> +		};
> +	};
> +
> +	/* freetronicsoled128 */
> +	fragment@11 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "solomon,ssd1351";
> +			spi-max-frequency = <20000000>;
> +			backlight = <2>; /* FBTFT_ONBOARD_BACKLIGHT */
> +			bgr;
> +		};
> +	};
> +
> +	/* hy28a */
> +	fragment@12 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9320";
> +			spi-max-frequency = <32000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			startbyte = <0x70>;
> +			bgr;
> +		};
> +	};
> +
> +	/* hy28b */
> +	fragment@13 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9325";
> +			spi-max-frequency = <48000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			init = <0x010000e7 0x0010
> +				0x01000000 0x0001
> +				0x01000001 0x0100
> +				0x01000002 0x0700
> +				0x01000003 0x1030
> +				0x01000004 0x0000
> +				0x01000008 0x0207
> +				0x01000009 0x0000
> +				0x0100000a 0x0000
> +				0x0100000c 0x0001
> +				0x0100000d 0x0000
> +				0x0100000f 0x0000
> +				0x01000010 0x0000
> +				0x01000011 0x0007
> +				0x01000012 0x0000
> +				0x01000013 0x0000
> +				0x02000032
> +				0x01000010 0x1590
> +				0x01000011 0x0227
> +				0x02000032
> +				0x01000012 0x009c
> +				0x02000032
> +				0x01000013 0x1900
> +				0x01000029 0x0023
> +				0x0100002b 0x000e
> +				0x02000032
> +				0x01000020 0x0000
> +				0x01000021 0x0000
> +				0x02000032
> +				0x01000050 0x0000
> +				0x01000051 0x00ef
> +				0x01000052 0x0000
> +				0x01000053 0x013f
> +				0x01000060 0xa700
> +				0x01000061 0x0001
> +				0x0100006a 0x0000
> +				0x01000080 0x0000
> +				0x01000081 0x0000
> +				0x01000082 0x0000
> +				0x01000083 0x0000
> +				0x01000084 0x0000
> +				0x01000085 0x0000
> +				0x01000090 0x0010
> +				0x01000092 0x0000
> +				0x01000093 0x0003
> +				0x01000095 0x0110
> +				0x01000097 0x0000
> +				0x01000098 0x0000
> +				0x01000007 0x0133
> +				0x01000020 0x0000
> +				0x01000021 0x0000
> +				0x02000064>;
> +			startbyte = <0x70>;
> +			bgr;
> +			fps = <50>;
> +			gamma = "04 1F 4 7 7 0 7 7 6 0\n0F 00 1 7 4 0 0 0 6 7";
> +		};
> +	};
> +
> +	/* itdb28_spi */
> +	fragment@14 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9325";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* mi0283qt-2 */
> +	fragment@15 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "himax,hx8347d";
> +			spi-max-frequency = <32000000>;
> +			startbyte = <0x70>;
> +			bgr;
> +		};
> +	};
> +
> +	/* mi0283qt-9a */
> +	fragment@16 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9341";
> +			spi-max-frequency = <32000000>;
> +			buswidth = <9>;
> +			bgr;
> +		};
> +	};
> +
> +	/* nokia3310 */
> +	fragment@17 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "philips,pcd8544";
> +			spi-max-frequency = <400000>;
> +		};
> +	};
> +
> +	/* nokia3310a */
> +	fragment@18 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "teralane,tls8204";
> +			spi-max-frequency = <1000000>;
> +		};
> +	};
> +
> +	/* nokia5110 */
> +	fragment@19 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9163";
> +			spi-max-frequency = <12000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* piscreen */
> +	fragment@20 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9486";
> +			spi-max-frequency = <32000000>;
> +			regwidth = <16>;
> +			bgr;
> +		};
> +	};
> +
> +	/* pitft */
> +	fragment@21 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9340";
> +			spi-max-frequency = <32000000>;
> +			init = <0x01000001
> +				0x02000005
> +				0x01000028
> +				0x010000EF 0x03 0x80 0x02
> +				0x010000CF 0x00 0xC1 0x30
> +				0x010000ED 0x64 0x03 0x12 0x81
> +				0x010000E8 0x85 0x00 0x78
> +				0x010000CB 0x39 0x2C 0x00 0x34 0x02
> +				0x010000F7 0x20
> +				0x010000EA 0x00 0x00
> +				0x010000C0 0x23
> +				0x010000C1 0x10
> +				0x010000C5 0x3E 0x28
> +				0x010000C7 0x86
> +				0x0100003A 0x55
> +				0x010000B1 0x00 0x18
> +				0x010000B6 0x08 0x82 0x27
> +				0x010000F2 0x00
> +				0x01000026 0x01
> +				0x010000E0 0x0F 0x31 0x2B 0x0C 0x0E 0x08 0x4E 0xF1 0x37 0x07 0x10 0x03 0x0E 0x09 0x00
> +				0x010000E1 0x00 0x0E 0x14 0x03 0x11 0x07 0x31 0xC1 0x48 0x08 0x0F 0x0C 0x31 0x36 0x0F
> +				0x01000011
> +				0x02000064
> +				0x01000029
> +				0x02000014>;
> +			bgr;
> +		};
> +	};
> +
> +	/* pioled */
> +	fragment@22 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "solomon,ssd1351";
> +			spi-max-frequency = <20000000>;
> +			bgr;
> +			gamma = "0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4";
> +		};
> +	};
> +
> +	/* rpi-display */
> +	fragment@23 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9341";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* sainsmart18 */
> +	fragment@24 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "sitronix,st7735r";
> +			spi-max-frequency = <32000000>;
> +		};
> +	};
> +
> +	/* sainsmart32_spi */
> +	fragment@25 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "solomon,ssd1289";
> +			spi-max-frequency = <16000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* tinylcd35 */
> +	fragment@26 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "neosec,tinylcd";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* tm022hdh26 */
> +	fragment@27 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9341";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* tontec35_9481 - boards before 02 July 2014 */
> +	fragment@28 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9481";
> +			spi-max-frequency = <128000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			bgr;
> +		};
> +	};
> +
> +	/* tontec35_9486 - boards after 02 July 2014 */
> +	fragment@29 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9486";
> +			spi-max-frequency = <128000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			bgr;
> +		};
> +	};
> +
> +	/* waveshare32b */
> +	fragment@30 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9340";
> +			spi-max-frequency = <48000000>;
> +			init = <0x010000CB 0x39 0x2C 0x00 0x34 0x02
> +				0x010000CF 0x00 0xC1 0x30
> +				0x010000E8 0x85 0x00 0x78
> +				0x010000EA 0x00 0x00
> +				0x010000ED 0x64 0x03 0x12 0x81
> +				0x010000F7 0x20
> +				0x010000C0 0x23
> +				0x010000C1 0x10
> +				0x010000C5 0x3E 0x28
> +				0x010000C7 0x86
> +				0x01000036 0x28
> +				0x0100003A 0x55
> +				0x010000B1 0x00 0x18
> +				0x010000B6 0x08 0x82 0x27
> +				0x010000F2 0x00
> +				0x01000026 0x01
> +				0x010000E0 0x0F 0x31 0x2B 0x0C 0x0E 0x08 0x4E 0xF1 0x37 0x07 0x10 0x03 0x0E 0x09 0x00
> +				0x010000E1 0x00 0x0E 0x14 0x03 0x11 0x07 0x31 0xC1 0x48 0x08 0x0F 0x0C 0x31 0x36 0x0F
> +				0x01000011
> +				0x02000078
> +				0x01000029
> +				0x0100002C>;
> +			bgr;
> +		};
> +	};
> +
> +	/* waveshare22 */
> +	fragment@31 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "hitachi,bd663474";
> +			spi-max-frequency = <32000000>;
> +			spi-cpha;
> +			spi-cpol;
> +		};
> +	};
> +
> +	spidev_fragment: fragment@100 {
> +		target-path = "spi0/spidev@0";
> +		__overlay__ {
> +			status = "disabled";
> +		};
> +	};
> +
> +	display_fragment: fragment@101 {
> +		target = <&spi0>;
> +		__overlay__ {
> +			/* needed to avoid dtc warning */
> +			#address-cells = <1>;
> +			#size-cells = <0>;
> +
> +			status = "okay";
> +
> +			display: display@0{
> +				reg = <0>;
> +				spi-max-frequency = <32000000>;
> +				fps = <30>;
> +				buswidth = <8>;
> +			};
> +		};
> +	};
> +
> +	__overrides__ {
> +		spi0-0        = <&display_fragment>, "target:0=",<&spi0>,
> +				<&spidev_fragment>, "target-path=spi0/spidev@0",
> +				<&display>, "reg:0=0";
> +		spi0-1        = <&display_fragment>, "target:0=",<&spi0>,
> +				<&spidev_fragment>, "target-path=spi0/spidev@1",
> +				<&display>, "reg:0=1";
> +		spi1-0        = <&display_fragment>, "target:0=",<&spi1>,
> +				<&spidev_fragment>, "target-path=spi1/spidev@0",
> +				<&display>, "reg:0=0";
> +		spi1-1        = <&display_fragment>, "target:0=",<&spi1>,
> +				<&spidev_fragment>, "target-path=spi1/spidev@1",
> +				<&display>, "reg:0=1";
> +		spi1-2        = <&display_fragment>, "target:0=",<&spi1>,
> +				<&spidev_fragment>, "target-path=spi1/spidev@2",
> +				<&display>, "reg:0=2";
> +		spi2-0        = <&display_fragment>, "target:0=",<&spi2>,
> +				<&spidev_fragment>, "target-path=spi2/spidev@0",
> +				<&display>, "reg:0=0";
> +		spi2-1        = <&display_fragment>, "target:0=",<&spi2>,
> +				<&spidev_fragment>, "target-path=spi2/spidev@1",
> +				<&display>, "reg:0=1";
> +		spi2-2        = <&display_fragment>, "target:0=",<&spi2>,
> +				<&spidev_fragment>, "target-path=spi2/spidev@2",
> +				<&display>, "reg:0=2";
> +
> +		speed         = <&display>, "spi-max-frequency:0";
> +		cpha          = <&display>, "spi-cpha?";
> +		cpol          = <&display>, "spi-cpol?";
> +
> +		/* Displays */
> +		adafruit18    = <0>, "+0";
> +		adafruit22    = <0>, "+1";
> +		adafruit22a   = <0>, "+2";
> +		adafruit28    = <0>, "+3";
> +		adafruit13m   = <0>, "+4";
> +		admatec_c-berry28 = <0>, "+5";
> +		dogs102       = <0>, "+6";
> +		er_tftm050_2  = <0>, "+7";
> +		er_tftm070_5  = <0>, "+8";
> +		ew24ha0       = <0>, "+9";
> +		ew24ha0_9bit  = <0>, "+10";
> +		freetronicsoled128 = <0>, "+11";
> +		hy28a         = <0>, "+12";
> +		hy28b         = <0>, "+13";
> +		itdb28_spi    = <0>, "+14";
> +		mi0283qt-2    = <0>, "+15";
> +		mi0283qt-9a   = <0>, "+16";
> +		nokia3310     = <0>, "+17";
> +		nokia3310a    = <0>, "+18";
> +		nokia5110     = <0>, "+19";
> +		piscreen      = <0>, "+20";
> +		pitft         = <0>, "+21";
> +		pioled        = <0>, "+22";
> +		rpi-display   = <0>, "+23";
> +		sainsmart18   = <0>, "+24";
> +		sainsmart32_spi = <0>, "+25";
> +		tinylcd35     = <0>, "+26";
> +		tm022hdh26    = <0>, "+27";
> +		tontec35_9481 = <0>, "+28";
> +		tontec35_9486 = <0>, "+29";
> +		waveshare32b  = <0>, "+30";
> +		waveshare22   = <0>, "+31";
> +
> +		/* Controllers */
> +		bd663474      = <&display>, "compatible=hitachi,bd663474";
> +		hx8340bn      = <&display>, "compatible=himax,hx8340bn";
> +		hx8347d       = <&display>, "compatible=himax,hx8347d";
> +		hx8353d       = <&display>, "compatible=himax,hx8353d";
> +		hx8357d       = <&display>, "compatible=himax,hx8357d";
> +		ili9163       = <&display>, "compatible=ilitek,ili9163";
> +		ili9320       = <&display>, "compatible=ilitek,ili9320";
> +		ili9325       = <&display>, "compatible=ilitek,ili9325";
> +		ili9340       = <&display>, "compatible=ilitek,ili9340";
> +		ili9341       = <&display>, "compatible=ilitek,ili9341";
> +		ili9481       = <&display>, "compatible=ilitek,ili9481";
> +		ili9486       = <&display>, "compatible=ilitek,ili9486";
> +		pcd8544       = <&display>, "compatible=philips,pcd8544";
> +		ra8875        = <&display>, "compatible=raio,ra8875";
> +		s6d02a1       = <&display>, "compatible=samsung,s6d02a1";
> +		s6d1121       = <&display>, "compatible=samsung,s6d1121";
> +		seps525       = <&display>, "compatible=syncoam,seps525";
> +		sh1106        = <&display>, "compatible=sinowealth,sh1106";
> +		ssd1289       = <&display>, "compatible=solomon,ssd1289";
> +		ssd1305       = <&display>, "compatible=solomon,ssd1305";
> +		ssd1306       = <&display>, "compatible=solomon,ssd1306";
> +		ssd1325       = <&display>, "compatible=solomon,ssd1325";
> +		ssd1331       = <&display>, "compatible=solomon,ssd1331";
> +		ssd1351       = <&display>, "compatible=solomon,ssd1351";
> +		st7735r       = <&display>, "compatible=sitronix,st7735r";
> +		st7789v       = <&display>, "compatible=sitronix,st7789v";
> +		tls8204       = <&display>, "compatible=teralane,tls8204";
> +		uc1611        = <&display>, "compatible=ultrachip,uc1611";
> +		uc1701        = <&display>, "compatible=UltraChip,uc1701";
> +		upd161704     = <&display>, "compatible=nec,upd161704";
> +
> +		width         = <&display>, "width:0";
> +		height        = <&display>, "height:0";
> +		regwidth      = <&display>, "regwidth:0";
> +		buswidth      = <&display>, "buswidth:0";
> +		debug         = <&display>, "debug:0";
> +		rotate        = <&display>, "rotate:0";
> +		bgr           = <&display>, "bgr?";
> +		fps           = <&display>, "fps:0";
> +		txbuflen      = <&display>, "txbuflen:0";
> +		startbyte     = <&display>, "startbyte:0";
> +		gamma         = <&display>, "gamma";
> +
> +		reset_pin     = <&display>, "reset-gpios:0=", <&gpio>,
> +				<&display>, "reset-gpios:4",
> +				<&display>, "reset-gpios:8=1"; /* GPIO_ACTIVE_LOW */
> +		dc_pin        = <&display>, "dc-gpios:0=", <&gpio>,
> +				<&display>, "dc-gpios:4",
> +				<&display>, "dc-gpios:8=0"; /* GPIO_ACTIVE_HIGH */
> +		led_pin       = <&display>, "led-gpios:0=", <&gpio>,
> +				<&display>, "led-gpios:4",
> +				<&display>, "led-gpios:8=0"; /* GPIO_ACTIVE_HIGH */
> +	};
> +};
Juerg Haefliger Aug. 15, 2022, 7:12 a.m. UTC | #3
Applied to focal/raspi master-next branch.

...Juerg


> From: Noralf Trønnes <noralf@tronnes.org>
> 
> BugLink: https://bugs.launchpad.net/bugs/1963919
> 
> Add an overlay that provides much of the functionality that fbtft_device did.
> 
> Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
> 
> (cherry picked from commit 6a4525924c43f343951c67af4963386b477938af rpi-5.15-y)
> Signed-off-by: Juerg Haefliger <juerg.haefliger@canonical.com>
> ---
>  arch/arm/boot/dts/overlays/Makefile          |   1 +
>  arch/arm/boot/dts/overlays/README            | 124 ++++
>  arch/arm/boot/dts/overlays/fbtft-overlay.dts | 611 +++++++++++++++++++
>  3 files changed, 736 insertions(+)
>  create mode 100644 arch/arm/boot/dts/overlays/fbtft-overlay.dts
> 
> diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile
> index b2c782407fe0..bfb27ab9e928 100644
> --- a/arch/arm/boot/dts/overlays/Makefile
> +++ b/arch/arm/boot/dts/overlays/Makefile
> @@ -44,6 +44,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
>  	enc28j60.dtbo \
>  	enc28j60-spi2.dtbo \
>  	exc3000.dtbo \
> +	fbtft.dtbo \
>  	fe-pi-audio.dtbo \
>  	fsm-demo.dtbo \
>  	ghost-amp.dtbo \
> diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README
> index 03fdbdbe4729..a88f0710466c 100644
> --- a/arch/arm/boot/dts/overlays/README
> +++ b/arch/arm/boot/dts/overlays/README
> @@ -805,6 +805,130 @@ Params: interrupt               GPIO used for interrupt (default 4)
>          swapxy                  Touchscreen swapped x y axis
>  
>  
> +Name:   fbtft
> +Info:   Overlay for SPI-connected displays using the fbtft drivers.
> +
> +        This overlay seeks to replace the functionality provided by fbtft_device
> +        which is now gone from the kernel.
> +
> +        Most displays from fbtft_device have been ported over.
> +        Example:
> +          dtoverlay=fbtft,spi0-0,rpi-display,reset_pin=23,dc_pin=24,led_pin=18,rotate=270
> +
> +        It is also possible to specify the controller (this will use the default
> +        init sequence in the driver).
> +        Example:
> +          dtoverlay=fbtft,spi0-0,ili9341,bgr,reset_pin=23,dc_pin=24,led_pin=18,rotate=270
> +
> +        For devices on spi1 or spi2, the interfaces should be enabled
> +        with one of the spi1-1/2/3cs and/or spi2-1/2/3cs overlays.
> +
> +        The following features of fbtft_device have not been ported over:
> +        - parallel bus is not supported
> +        - the init property which overrides the controller initialization
> +          sequence is not supported as a parameter due to memory limitations in
> +          the bootloader responsible for applying the overlay.
> +
> +        See https://github.com/notro/fbtft/wiki/FBTFT-RPI-overlays for how to
> +        create an overlay.
> +
> +Load:   dtoverlay=fbtft,<param>=<val>
> +Params:
> +        spi<n>-<m>              Configure device at spi<n>, cs<m>
> +                                (boolean, required)
> +        speed                   SPI bus speed in Hz (default 32000000)
> +        cpha                    Shifted clock phase (CPHA) mode
> +        cpol                    Inverse clock polarity (CPOL) mode
> +
> +        adafruit18              Adafruit 1.8
> +        adafruit22              Adafruit 2.2 (old)
> +        adafruit22a             Adafruit 2.2
> +        adafruit28              Adafruit 2.8
> +        adafruit13m             Adafruit 1.3 OLED
> +        admatec_c-berry28       C-Berry28
> +        dogs102                 EA DOGS102
> +        er_tftm050_2            ER-TFTM070-2
> +        er_tftm070_5            ER-TFTM070-5
> +        ew24ha0                 EW24HA0
> +        ew24ha0_9bit            EW24HA0 in 9-bit mode
> +        freetronicsoled128      Freetronics OLED128
> +        hy28a                   HY28A
> +        hy28b                   HY28B
> +        itdb28_spi              ITDB02-2.8 with SPI interface circuit
> +        mi0283qt-2              Watterott MI0283QT-2
> +        mi0283qt-9a             Watterott MI0283QT-9A
> +        nokia3310               Nokia 3310
> +        nokia3310a              Nokia 3310a
> +        nokia5110               Nokia 5110
> +        piscreen                PiScreen
> +        pitft                   Adafruit PiTFT 2.8
> +        pioled                  ILSoft OLED
> +        rpi-display             Watterott rpi-display
> +        sainsmart18             Sainsmart 1.8
> +        sainsmart32_spi         Sainsmart 3.2 with SPI interfce circuit
> +        tinylcd35               TinyLCD 3.5
> +        tm022hdh26              Tianma TM022HDH26
> +        tontec35_9481           Tontect 3.5 with ILI9481 controller
> +        tontec35_9486           Tontect 3.5 with ILI9486 controller
> +        waveshare32b            Waveshare 3.2
> +        waveshare22             Waveshare 2.2
> +
> +        bd663474                BD663474 display controller
> +        hx8340bn                HX8340BN display controller
> +        hx8347d                 HX8347D display controller
> +        hx8353d                 HX8353D display controller
> +        hx8357d                 HX8357D display controller
> +        ili9163                 ILI9163 display controller
> +        ili9320                 ILI9320 display controller
> +        ili9325                 ILI9325 display controller
> +        ili9340                 ILI9340 display controller
> +        ili9341                 ILI9341 display controller
> +        ili9481                 ILI9481 display controller
> +        ili9486                 ILI9486 display controller
> +        pcd8544                 PCD8544 display controller
> +        ra8875                  RA8875 display controller
> +        s6d02a1                 S6D02A1 display controller
> +        s6d1121                 S6D1121 display controller
> +        seps525                 SEPS525 display controller
> +        sh1106                  SH1106 display controller
> +        ssd1289                 SSD1289 display controller
> +        ssd1305                 SSD1305 display controller
> +        ssd1306                 SSD1306 display controller
> +        ssd1325                 SSD1325 display controller
> +        ssd1331                 SSD1331 display controller
> +        ssd1351                 SSD1351 display controller
> +        st7735r                 ST7735R display controller
> +        st7789v                 ST7789V display controller
> +        tls8204                 TLS8204 display controller
> +        uc1611                  UC1611 display controller
> +        uc1701                  UC1701 display controller
> +        upd161704               UPD161704 display controller
> +
> +        width                   Display width in pixels
> +        height                  Display height in pixels
> +        regwidth                Display controller register width (default is
> +                                driver specific)
> +        buswidth                Display bus interface width (default 8)
> +        debug                   Debug output level {0-7}
> +        rotate                  Display rotation {0, 90, 180, 270} (counter
> +                                clockwise). Not supported by all drivers.
> +        bgr                     Enable BGR mode (default off). Use if Red and
> +                                Blue are swapped. Not supported by all drivers.
> +        fps                     Frames per second (default 30). In effect this
> +                                states how long the driver will wait after video
> +                                memory has been changed until display update
> +                                transfer is started.
> +        txbuflen                Length of the FBTFT transmit buffer
> +                                (default 4096)
> +        startbyte               Sets the Start byte used by fb_ili9320,
> +                                fb_ili9325 and fb_hx8347d. Common value is 0x70.
> +        gamma                   String representation of Gamma Curve(s). Driver
> +                                specific. Not supported by all drivers.
> +        reset_pin               GPIO pin for RESET
> +        dc_pin                  GPIO pin for D/C
> +        led_pin                 GPIO pin for LED backlight
> +
> +
>  Name:   fe-pi-audio
>  Info:   Configures the Fe-Pi Audio Sound Card
>  Load:   dtoverlay=fe-pi-audio
> diff --git a/arch/arm/boot/dts/overlays/fbtft-overlay.dts b/arch/arm/boot/dts/overlays/fbtft-overlay.dts
> new file mode 100644
> index 000000000000..db45f8c53bcc
> --- /dev/null
> +++ b/arch/arm/boot/dts/overlays/fbtft-overlay.dts
> @@ -0,0 +1,611 @@
> +/*
> + * Device Tree overlay for fbtft drivers
> + */
> +
> +/dts-v1/;
> +/plugin/;
> +
> +/ {
> +	compatible = "brcm,bcm2835";
> +
> +	/* adafruit18 */
> +	fragment@0 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "sitronix,st7735r";
> +			spi-max-frequency = <32000000>;
> +			gamma = "02 1c 07 12 37 32 29 2d 29 25 2B 39 00 01 03 10\n03 1d 07 06 2E 2C 29 2D 2E 2E 37 3F 00 00 02 10";
> +		};
> +	};
> +
> +	/* adafruit22 */
> +	fragment@1 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "himax,hx8340bn";
> +			spi-max-frequency = <32000000>;
> +			buswidth = <9>;
> +			bgr;
> +		};
> +	};
> +
> +	/* adafruit22a */
> +	fragment@2 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9340";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* adafruit28 */
> +	fragment@3 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9341";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* adafruit13m */
> +	fragment@4 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "solomon,ssd1306";
> +			spi-max-frequency = <16000000>;
> +		};
> +	};
> +
> +	/* admatec_c-berry28 */
> +	fragment@5 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "sitronix,st7789v";
> +			spi-max-frequency = <48000000>;
> +			init = <0x01000011
> +				0x02000078
> +				0x0100003A 0x05
> +				0x010000B2 0x0C 0x0C 0x00 0x33 0x33
> +				0x010000B7 0x35
> +				0x010000C2 0x01 0xFF
> +				0x010000C3 0x17
> +				0x010000C4 0x20
> +				0x010000BB 0x17
> +				0x010000C5 0x20
> +				0x010000D0 0xA4 0xA1
> +				0x01000029>;
> +			gamma = "D0 00 14 15 13 2C 42 43 4E 09 16 14 18 21\nD0 00 14 15 13 0B 43 55 53 0C 17 14 23 20";
> +		};
> +	};
> +
> +	/* dogs102 */
> +	fragment@6 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "UltraChip,uc1701";
> +			spi-max-frequency = <8000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* er_tftm050_2 */
> +	fragment@7 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "raio,ra8875";
> +			spi-max-frequency = <5000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			width = <480>;
> +			height = <272>;
> +			bgr;
> +		};
> +	};
> +
> +	/* er_tftm070_5 */
> +	fragment@8 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "raio,ra8875";
> +			spi-max-frequency = <5000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			width = <800>;
> +			height = <480>;
> +			bgr;
> +		};
> +	};
> +
> +	/* ew24ha0 */
> +	fragment@9 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ultrachip,uc1611";
> +			spi-max-frequency = <32000000>;
> +			spi-cpha;
> +			spi-cpol;
> +		};
> +	};
> +
> +	/* ew24ha0_9bit */
> +	fragment@10 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ultrachip,uc1611";
> +			spi-max-frequency = <32000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			buswidth = <9>;
> +		};
> +	};
> +
> +	/* freetronicsoled128 */
> +	fragment@11 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "solomon,ssd1351";
> +			spi-max-frequency = <20000000>;
> +			backlight = <2>; /* FBTFT_ONBOARD_BACKLIGHT */
> +			bgr;
> +		};
> +	};
> +
> +	/* hy28a */
> +	fragment@12 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9320";
> +			spi-max-frequency = <32000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			startbyte = <0x70>;
> +			bgr;
> +		};
> +	};
> +
> +	/* hy28b */
> +	fragment@13 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9325";
> +			spi-max-frequency = <48000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			init = <0x010000e7 0x0010
> +				0x01000000 0x0001
> +				0x01000001 0x0100
> +				0x01000002 0x0700
> +				0x01000003 0x1030
> +				0x01000004 0x0000
> +				0x01000008 0x0207
> +				0x01000009 0x0000
> +				0x0100000a 0x0000
> +				0x0100000c 0x0001
> +				0x0100000d 0x0000
> +				0x0100000f 0x0000
> +				0x01000010 0x0000
> +				0x01000011 0x0007
> +				0x01000012 0x0000
> +				0x01000013 0x0000
> +				0x02000032
> +				0x01000010 0x1590
> +				0x01000011 0x0227
> +				0x02000032
> +				0x01000012 0x009c
> +				0x02000032
> +				0x01000013 0x1900
> +				0x01000029 0x0023
> +				0x0100002b 0x000e
> +				0x02000032
> +				0x01000020 0x0000
> +				0x01000021 0x0000
> +				0x02000032
> +				0x01000050 0x0000
> +				0x01000051 0x00ef
> +				0x01000052 0x0000
> +				0x01000053 0x013f
> +				0x01000060 0xa700
> +				0x01000061 0x0001
> +				0x0100006a 0x0000
> +				0x01000080 0x0000
> +				0x01000081 0x0000
> +				0x01000082 0x0000
> +				0x01000083 0x0000
> +				0x01000084 0x0000
> +				0x01000085 0x0000
> +				0x01000090 0x0010
> +				0x01000092 0x0000
> +				0x01000093 0x0003
> +				0x01000095 0x0110
> +				0x01000097 0x0000
> +				0x01000098 0x0000
> +				0x01000007 0x0133
> +				0x01000020 0x0000
> +				0x01000021 0x0000
> +				0x02000064>;
> +			startbyte = <0x70>;
> +			bgr;
> +			fps = <50>;
> +			gamma = "04 1F 4 7 7 0 7 7 6 0\n0F 00 1 7 4 0 0 0 6 7";
> +		};
> +	};
> +
> +	/* itdb28_spi */
> +	fragment@14 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9325";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* mi0283qt-2 */
> +	fragment@15 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "himax,hx8347d";
> +			spi-max-frequency = <32000000>;
> +			startbyte = <0x70>;
> +			bgr;
> +		};
> +	};
> +
> +	/* mi0283qt-9a */
> +	fragment@16 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9341";
> +			spi-max-frequency = <32000000>;
> +			buswidth = <9>;
> +			bgr;
> +		};
> +	};
> +
> +	/* nokia3310 */
> +	fragment@17 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "philips,pcd8544";
> +			spi-max-frequency = <400000>;
> +		};
> +	};
> +
> +	/* nokia3310a */
> +	fragment@18 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "teralane,tls8204";
> +			spi-max-frequency = <1000000>;
> +		};
> +	};
> +
> +	/* nokia5110 */
> +	fragment@19 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9163";
> +			spi-max-frequency = <12000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* piscreen */
> +	fragment@20 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9486";
> +			spi-max-frequency = <32000000>;
> +			regwidth = <16>;
> +			bgr;
> +		};
> +	};
> +
> +	/* pitft */
> +	fragment@21 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9340";
> +			spi-max-frequency = <32000000>;
> +			init = <0x01000001
> +				0x02000005
> +				0x01000028
> +				0x010000EF 0x03 0x80 0x02
> +				0x010000CF 0x00 0xC1 0x30
> +				0x010000ED 0x64 0x03 0x12 0x81
> +				0x010000E8 0x85 0x00 0x78
> +				0x010000CB 0x39 0x2C 0x00 0x34 0x02
> +				0x010000F7 0x20
> +				0x010000EA 0x00 0x00
> +				0x010000C0 0x23
> +				0x010000C1 0x10
> +				0x010000C5 0x3E 0x28
> +				0x010000C7 0x86
> +				0x0100003A 0x55
> +				0x010000B1 0x00 0x18
> +				0x010000B6 0x08 0x82 0x27
> +				0x010000F2 0x00
> +				0x01000026 0x01
> +				0x010000E0 0x0F 0x31 0x2B 0x0C 0x0E 0x08 0x4E 0xF1 0x37 0x07 0x10 0x03 0x0E 0x09 0x00
> +				0x010000E1 0x00 0x0E 0x14 0x03 0x11 0x07 0x31 0xC1 0x48 0x08 0x0F 0x0C 0x31 0x36 0x0F
> +				0x01000011
> +				0x02000064
> +				0x01000029
> +				0x02000014>;
> +			bgr;
> +		};
> +	};
> +
> +	/* pioled */
> +	fragment@22 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "solomon,ssd1351";
> +			spi-max-frequency = <20000000>;
> +			bgr;
> +			gamma = "0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4";
> +		};
> +	};
> +
> +	/* rpi-display */
> +	fragment@23 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9341";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* sainsmart18 */
> +	fragment@24 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "sitronix,st7735r";
> +			spi-max-frequency = <32000000>;
> +		};
> +	};
> +
> +	/* sainsmart32_spi */
> +	fragment@25 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "solomon,ssd1289";
> +			spi-max-frequency = <16000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* tinylcd35 */
> +	fragment@26 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "neosec,tinylcd";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* tm022hdh26 */
> +	fragment@27 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9341";
> +			spi-max-frequency = <32000000>;
> +			bgr;
> +		};
> +	};
> +
> +	/* tontec35_9481 - boards before 02 July 2014 */
> +	fragment@28 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9481";
> +			spi-max-frequency = <128000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			bgr;
> +		};
> +	};
> +
> +	/* tontec35_9486 - boards after 02 July 2014 */
> +	fragment@29 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9486";
> +			spi-max-frequency = <128000000>;
> +			spi-cpha;
> +			spi-cpol;
> +			bgr;
> +		};
> +	};
> +
> +	/* waveshare32b */
> +	fragment@30 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "ilitek,ili9340";
> +			spi-max-frequency = <48000000>;
> +			init = <0x010000CB 0x39 0x2C 0x00 0x34 0x02
> +				0x010000CF 0x00 0xC1 0x30
> +				0x010000E8 0x85 0x00 0x78
> +				0x010000EA 0x00 0x00
> +				0x010000ED 0x64 0x03 0x12 0x81
> +				0x010000F7 0x20
> +				0x010000C0 0x23
> +				0x010000C1 0x10
> +				0x010000C5 0x3E 0x28
> +				0x010000C7 0x86
> +				0x01000036 0x28
> +				0x0100003A 0x55
> +				0x010000B1 0x00 0x18
> +				0x010000B6 0x08 0x82 0x27
> +				0x010000F2 0x00
> +				0x01000026 0x01
> +				0x010000E0 0x0F 0x31 0x2B 0x0C 0x0E 0x08 0x4E 0xF1 0x37 0x07 0x10 0x03 0x0E 0x09 0x00
> +				0x010000E1 0x00 0x0E 0x14 0x03 0x11 0x07 0x31 0xC1 0x48 0x08 0x0F 0x0C 0x31 0x36 0x0F
> +				0x01000011
> +				0x02000078
> +				0x01000029
> +				0x0100002C>;
> +			bgr;
> +		};
> +	};
> +
> +	/* waveshare22 */
> +	fragment@31 {
> +		target = <&display>;
> +		__dormant__ {
> +			compatible = "hitachi,bd663474";
> +			spi-max-frequency = <32000000>;
> +			spi-cpha;
> +			spi-cpol;
> +		};
> +	};
> +
> +	spidev_fragment: fragment@100 {
> +		target-path = "spi0/spidev@0";
> +		__overlay__ {
> +			status = "disabled";
> +		};
> +	};
> +
> +	display_fragment: fragment@101 {
> +		target = <&spi0>;
> +		__overlay__ {
> +			/* needed to avoid dtc warning */
> +			#address-cells = <1>;
> +			#size-cells = <0>;
> +
> +			status = "okay";
> +
> +			display: display@0{
> +				reg = <0>;
> +				spi-max-frequency = <32000000>;
> +				fps = <30>;
> +				buswidth = <8>;
> +			};
> +		};
> +	};
> +
> +	__overrides__ {
> +		spi0-0        = <&display_fragment>, "target:0=",<&spi0>,
> +				<&spidev_fragment>, "target-path=spi0/spidev@0",
> +				<&display>, "reg:0=0";
> +		spi0-1        = <&display_fragment>, "target:0=",<&spi0>,
> +				<&spidev_fragment>, "target-path=spi0/spidev@1",
> +				<&display>, "reg:0=1";
> +		spi1-0        = <&display_fragment>, "target:0=",<&spi1>,
> +				<&spidev_fragment>, "target-path=spi1/spidev@0",
> +				<&display>, "reg:0=0";
> +		spi1-1        = <&display_fragment>, "target:0=",<&spi1>,
> +				<&spidev_fragment>, "target-path=spi1/spidev@1",
> +				<&display>, "reg:0=1";
> +		spi1-2        = <&display_fragment>, "target:0=",<&spi1>,
> +				<&spidev_fragment>, "target-path=spi1/spidev@2",
> +				<&display>, "reg:0=2";
> +		spi2-0        = <&display_fragment>, "target:0=",<&spi2>,
> +				<&spidev_fragment>, "target-path=spi2/spidev@0",
> +				<&display>, "reg:0=0";
> +		spi2-1        = <&display_fragment>, "target:0=",<&spi2>,
> +				<&spidev_fragment>, "target-path=spi2/spidev@1",
> +				<&display>, "reg:0=1";
> +		spi2-2        = <&display_fragment>, "target:0=",<&spi2>,
> +				<&spidev_fragment>, "target-path=spi2/spidev@2",
> +				<&display>, "reg:0=2";
> +
> +		speed         = <&display>, "spi-max-frequency:0";
> +		cpha          = <&display>, "spi-cpha?";
> +		cpol          = <&display>, "spi-cpol?";
> +
> +		/* Displays */
> +		adafruit18    = <0>, "+0";
> +		adafruit22    = <0>, "+1";
> +		adafruit22a   = <0>, "+2";
> +		adafruit28    = <0>, "+3";
> +		adafruit13m   = <0>, "+4";
> +		admatec_c-berry28 = <0>, "+5";
> +		dogs102       = <0>, "+6";
> +		er_tftm050_2  = <0>, "+7";
> +		er_tftm070_5  = <0>, "+8";
> +		ew24ha0       = <0>, "+9";
> +		ew24ha0_9bit  = <0>, "+10";
> +		freetronicsoled128 = <0>, "+11";
> +		hy28a         = <0>, "+12";
> +		hy28b         = <0>, "+13";
> +		itdb28_spi    = <0>, "+14";
> +		mi0283qt-2    = <0>, "+15";
> +		mi0283qt-9a   = <0>, "+16";
> +		nokia3310     = <0>, "+17";
> +		nokia3310a    = <0>, "+18";
> +		nokia5110     = <0>, "+19";
> +		piscreen      = <0>, "+20";
> +		pitft         = <0>, "+21";
> +		pioled        = <0>, "+22";
> +		rpi-display   = <0>, "+23";
> +		sainsmart18   = <0>, "+24";
> +		sainsmart32_spi = <0>, "+25";
> +		tinylcd35     = <0>, "+26";
> +		tm022hdh26    = <0>, "+27";
> +		tontec35_9481 = <0>, "+28";
> +		tontec35_9486 = <0>, "+29";
> +		waveshare32b  = <0>, "+30";
> +		waveshare22   = <0>, "+31";
> +
> +		/* Controllers */
> +		bd663474      = <&display>, "compatible=hitachi,bd663474";
> +		hx8340bn      = <&display>, "compatible=himax,hx8340bn";
> +		hx8347d       = <&display>, "compatible=himax,hx8347d";
> +		hx8353d       = <&display>, "compatible=himax,hx8353d";
> +		hx8357d       = <&display>, "compatible=himax,hx8357d";
> +		ili9163       = <&display>, "compatible=ilitek,ili9163";
> +		ili9320       = <&display>, "compatible=ilitek,ili9320";
> +		ili9325       = <&display>, "compatible=ilitek,ili9325";
> +		ili9340       = <&display>, "compatible=ilitek,ili9340";
> +		ili9341       = <&display>, "compatible=ilitek,ili9341";
> +		ili9481       = <&display>, "compatible=ilitek,ili9481";
> +		ili9486       = <&display>, "compatible=ilitek,ili9486";
> +		pcd8544       = <&display>, "compatible=philips,pcd8544";
> +		ra8875        = <&display>, "compatible=raio,ra8875";
> +		s6d02a1       = <&display>, "compatible=samsung,s6d02a1";
> +		s6d1121       = <&display>, "compatible=samsung,s6d1121";
> +		seps525       = <&display>, "compatible=syncoam,seps525";
> +		sh1106        = <&display>, "compatible=sinowealth,sh1106";
> +		ssd1289       = <&display>, "compatible=solomon,ssd1289";
> +		ssd1305       = <&display>, "compatible=solomon,ssd1305";
> +		ssd1306       = <&display>, "compatible=solomon,ssd1306";
> +		ssd1325       = <&display>, "compatible=solomon,ssd1325";
> +		ssd1331       = <&display>, "compatible=solomon,ssd1331";
> +		ssd1351       = <&display>, "compatible=solomon,ssd1351";
> +		st7735r       = <&display>, "compatible=sitronix,st7735r";
> +		st7789v       = <&display>, "compatible=sitronix,st7789v";
> +		tls8204       = <&display>, "compatible=teralane,tls8204";
> +		uc1611        = <&display>, "compatible=ultrachip,uc1611";
> +		uc1701        = <&display>, "compatible=UltraChip,uc1701";
> +		upd161704     = <&display>, "compatible=nec,upd161704";
> +
> +		width         = <&display>, "width:0";
> +		height        = <&display>, "height:0";
> +		regwidth      = <&display>, "regwidth:0";
> +		buswidth      = <&display>, "buswidth:0";
> +		debug         = <&display>, "debug:0";
> +		rotate        = <&display>, "rotate:0";
> +		bgr           = <&display>, "bgr?";
> +		fps           = <&display>, "fps:0";
> +		txbuflen      = <&display>, "txbuflen:0";
> +		startbyte     = <&display>, "startbyte:0";
> +		gamma         = <&display>, "gamma";
> +
> +		reset_pin     = <&display>, "reset-gpios:0=", <&gpio>,
> +				<&display>, "reset-gpios:4",
> +				<&display>, "reset-gpios:8=1"; /* GPIO_ACTIVE_LOW */
> +		dc_pin        = <&display>, "dc-gpios:0=", <&gpio>,
> +				<&display>, "dc-gpios:4",
> +				<&display>, "dc-gpios:8=0"; /* GPIO_ACTIVE_HIGH */
> +		led_pin       = <&display>, "led-gpios:0=", <&gpio>,
> +				<&display>, "led-gpios:4",
> +				<&display>, "led-gpios:8=0"; /* GPIO_ACTIVE_HIGH */
> +	};
> +};
diff mbox series

Patch

diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile
index b2c782407fe0..bfb27ab9e928 100644
--- a/arch/arm/boot/dts/overlays/Makefile
+++ b/arch/arm/boot/dts/overlays/Makefile
@@ -44,6 +44,7 @@  dtbo-$(CONFIG_ARCH_BCM2835) += \
 	enc28j60.dtbo \
 	enc28j60-spi2.dtbo \
 	exc3000.dtbo \
+	fbtft.dtbo \
 	fe-pi-audio.dtbo \
 	fsm-demo.dtbo \
 	ghost-amp.dtbo \
diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README
index 03fdbdbe4729..a88f0710466c 100644
--- a/arch/arm/boot/dts/overlays/README
+++ b/arch/arm/boot/dts/overlays/README
@@ -805,6 +805,130 @@  Params: interrupt               GPIO used for interrupt (default 4)
         swapxy                  Touchscreen swapped x y axis
 
 
+Name:   fbtft
+Info:   Overlay for SPI-connected displays using the fbtft drivers.
+
+        This overlay seeks to replace the functionality provided by fbtft_device
+        which is now gone from the kernel.
+
+        Most displays from fbtft_device have been ported over.
+        Example:
+          dtoverlay=fbtft,spi0-0,rpi-display,reset_pin=23,dc_pin=24,led_pin=18,rotate=270
+
+        It is also possible to specify the controller (this will use the default
+        init sequence in the driver).
+        Example:
+          dtoverlay=fbtft,spi0-0,ili9341,bgr,reset_pin=23,dc_pin=24,led_pin=18,rotate=270
+
+        For devices on spi1 or spi2, the interfaces should be enabled
+        with one of the spi1-1/2/3cs and/or spi2-1/2/3cs overlays.
+
+        The following features of fbtft_device have not been ported over:
+        - parallel bus is not supported
+        - the init property which overrides the controller initialization
+          sequence is not supported as a parameter due to memory limitations in
+          the bootloader responsible for applying the overlay.
+
+        See https://github.com/notro/fbtft/wiki/FBTFT-RPI-overlays for how to
+        create an overlay.
+
+Load:   dtoverlay=fbtft,<param>=<val>
+Params:
+        spi<n>-<m>              Configure device at spi<n>, cs<m>
+                                (boolean, required)
+        speed                   SPI bus speed in Hz (default 32000000)
+        cpha                    Shifted clock phase (CPHA) mode
+        cpol                    Inverse clock polarity (CPOL) mode
+
+        adafruit18              Adafruit 1.8
+        adafruit22              Adafruit 2.2 (old)
+        adafruit22a             Adafruit 2.2
+        adafruit28              Adafruit 2.8
+        adafruit13m             Adafruit 1.3 OLED
+        admatec_c-berry28       C-Berry28
+        dogs102                 EA DOGS102
+        er_tftm050_2            ER-TFTM070-2
+        er_tftm070_5            ER-TFTM070-5
+        ew24ha0                 EW24HA0
+        ew24ha0_9bit            EW24HA0 in 9-bit mode
+        freetronicsoled128      Freetronics OLED128
+        hy28a                   HY28A
+        hy28b                   HY28B
+        itdb28_spi              ITDB02-2.8 with SPI interface circuit
+        mi0283qt-2              Watterott MI0283QT-2
+        mi0283qt-9a             Watterott MI0283QT-9A
+        nokia3310               Nokia 3310
+        nokia3310a              Nokia 3310a
+        nokia5110               Nokia 5110
+        piscreen                PiScreen
+        pitft                   Adafruit PiTFT 2.8
+        pioled                  ILSoft OLED
+        rpi-display             Watterott rpi-display
+        sainsmart18             Sainsmart 1.8
+        sainsmart32_spi         Sainsmart 3.2 with SPI interfce circuit
+        tinylcd35               TinyLCD 3.5
+        tm022hdh26              Tianma TM022HDH26
+        tontec35_9481           Tontect 3.5 with ILI9481 controller
+        tontec35_9486           Tontect 3.5 with ILI9486 controller
+        waveshare32b            Waveshare 3.2
+        waveshare22             Waveshare 2.2
+
+        bd663474                BD663474 display controller
+        hx8340bn                HX8340BN display controller
+        hx8347d                 HX8347D display controller
+        hx8353d                 HX8353D display controller
+        hx8357d                 HX8357D display controller
+        ili9163                 ILI9163 display controller
+        ili9320                 ILI9320 display controller
+        ili9325                 ILI9325 display controller
+        ili9340                 ILI9340 display controller
+        ili9341                 ILI9341 display controller
+        ili9481                 ILI9481 display controller
+        ili9486                 ILI9486 display controller
+        pcd8544                 PCD8544 display controller
+        ra8875                  RA8875 display controller
+        s6d02a1                 S6D02A1 display controller
+        s6d1121                 S6D1121 display controller
+        seps525                 SEPS525 display controller
+        sh1106                  SH1106 display controller
+        ssd1289                 SSD1289 display controller
+        ssd1305                 SSD1305 display controller
+        ssd1306                 SSD1306 display controller
+        ssd1325                 SSD1325 display controller
+        ssd1331                 SSD1331 display controller
+        ssd1351                 SSD1351 display controller
+        st7735r                 ST7735R display controller
+        st7789v                 ST7789V display controller
+        tls8204                 TLS8204 display controller
+        uc1611                  UC1611 display controller
+        uc1701                  UC1701 display controller
+        upd161704               UPD161704 display controller
+
+        width                   Display width in pixels
+        height                  Display height in pixels
+        regwidth                Display controller register width (default is
+                                driver specific)
+        buswidth                Display bus interface width (default 8)
+        debug                   Debug output level {0-7}
+        rotate                  Display rotation {0, 90, 180, 270} (counter
+                                clockwise). Not supported by all drivers.
+        bgr                     Enable BGR mode (default off). Use if Red and
+                                Blue are swapped. Not supported by all drivers.
+        fps                     Frames per second (default 30). In effect this
+                                states how long the driver will wait after video
+                                memory has been changed until display update
+                                transfer is started.
+        txbuflen                Length of the FBTFT transmit buffer
+                                (default 4096)
+        startbyte               Sets the Start byte used by fb_ili9320,
+                                fb_ili9325 and fb_hx8347d. Common value is 0x70.
+        gamma                   String representation of Gamma Curve(s). Driver
+                                specific. Not supported by all drivers.
+        reset_pin               GPIO pin for RESET
+        dc_pin                  GPIO pin for D/C
+        led_pin                 GPIO pin for LED backlight
+
+
 Name:   fe-pi-audio
 Info:   Configures the Fe-Pi Audio Sound Card
 Load:   dtoverlay=fe-pi-audio
diff --git a/arch/arm/boot/dts/overlays/fbtft-overlay.dts b/arch/arm/boot/dts/overlays/fbtft-overlay.dts
new file mode 100644
index 000000000000..db45f8c53bcc
--- /dev/null
+++ b/arch/arm/boot/dts/overlays/fbtft-overlay.dts
@@ -0,0 +1,611 @@ 
+/*
+ * Device Tree overlay for fbtft drivers
+ */
+
+/dts-v1/;
+/plugin/;
+
+/ {
+	compatible = "brcm,bcm2835";
+
+	/* adafruit18 */
+	fragment@0 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "sitronix,st7735r";
+			spi-max-frequency = <32000000>;
+			gamma = "02 1c 07 12 37 32 29 2d 29 25 2B 39 00 01 03 10\n03 1d 07 06 2E 2C 29 2D 2E 2E 37 3F 00 00 02 10";
+		};
+	};
+
+	/* adafruit22 */
+	fragment@1 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "himax,hx8340bn";
+			spi-max-frequency = <32000000>;
+			buswidth = <9>;
+			bgr;
+		};
+	};
+
+	/* adafruit22a */
+	fragment@2 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ilitek,ili9340";
+			spi-max-frequency = <32000000>;
+			bgr;
+		};
+	};
+
+	/* adafruit28 */
+	fragment@3 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ilitek,ili9341";
+			spi-max-frequency = <32000000>;
+			bgr;
+		};
+	};
+
+	/* adafruit13m */
+	fragment@4 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "solomon,ssd1306";
+			spi-max-frequency = <16000000>;
+		};
+	};
+
+	/* admatec_c-berry28 */
+	fragment@5 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "sitronix,st7789v";
+			spi-max-frequency = <48000000>;
+			init = <0x01000011
+				0x02000078
+				0x0100003A 0x05
+				0x010000B2 0x0C 0x0C 0x00 0x33 0x33
+				0x010000B7 0x35
+				0x010000C2 0x01 0xFF
+				0x010000C3 0x17
+				0x010000C4 0x20
+				0x010000BB 0x17
+				0x010000C5 0x20
+				0x010000D0 0xA4 0xA1
+				0x01000029>;
+			gamma = "D0 00 14 15 13 2C 42 43 4E 09 16 14 18 21\nD0 00 14 15 13 0B 43 55 53 0C 17 14 23 20";
+		};
+	};
+
+	/* dogs102 */
+	fragment@6 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "UltraChip,uc1701";
+			spi-max-frequency = <8000000>;
+			bgr;
+		};
+	};
+
+	/* er_tftm050_2 */
+	fragment@7 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "raio,ra8875";
+			spi-max-frequency = <5000000>;
+			spi-cpha;
+			spi-cpol;
+			width = <480>;
+			height = <272>;
+			bgr;
+		};
+	};
+
+	/* er_tftm070_5 */
+	fragment@8 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "raio,ra8875";
+			spi-max-frequency = <5000000>;
+			spi-cpha;
+			spi-cpol;
+			width = <800>;
+			height = <480>;
+			bgr;
+		};
+	};
+
+	/* ew24ha0 */
+	fragment@9 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ultrachip,uc1611";
+			spi-max-frequency = <32000000>;
+			spi-cpha;
+			spi-cpol;
+		};
+	};
+
+	/* ew24ha0_9bit */
+	fragment@10 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ultrachip,uc1611";
+			spi-max-frequency = <32000000>;
+			spi-cpha;
+			spi-cpol;
+			buswidth = <9>;
+		};
+	};
+
+	/* freetronicsoled128 */
+	fragment@11 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "solomon,ssd1351";
+			spi-max-frequency = <20000000>;
+			backlight = <2>; /* FBTFT_ONBOARD_BACKLIGHT */
+			bgr;
+		};
+	};
+
+	/* hy28a */
+	fragment@12 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ilitek,ili9320";
+			spi-max-frequency = <32000000>;
+			spi-cpha;
+			spi-cpol;
+			startbyte = <0x70>;
+			bgr;
+		};
+	};
+
+	/* hy28b */
+	fragment@13 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ilitek,ili9325";
+			spi-max-frequency = <48000000>;
+			spi-cpha;
+			spi-cpol;
+			init = <0x010000e7 0x0010
+				0x01000000 0x0001
+				0x01000001 0x0100
+				0x01000002 0x0700
+				0x01000003 0x1030
+				0x01000004 0x0000
+				0x01000008 0x0207
+				0x01000009 0x0000
+				0x0100000a 0x0000
+				0x0100000c 0x0001
+				0x0100000d 0x0000
+				0x0100000f 0x0000
+				0x01000010 0x0000
+				0x01000011 0x0007
+				0x01000012 0x0000
+				0x01000013 0x0000
+				0x02000032
+				0x01000010 0x1590
+				0x01000011 0x0227
+				0x02000032
+				0x01000012 0x009c
+				0x02000032
+				0x01000013 0x1900
+				0x01000029 0x0023
+				0x0100002b 0x000e
+				0x02000032
+				0x01000020 0x0000
+				0x01000021 0x0000
+				0x02000032
+				0x01000050 0x0000
+				0x01000051 0x00ef
+				0x01000052 0x0000
+				0x01000053 0x013f
+				0x01000060 0xa700
+				0x01000061 0x0001
+				0x0100006a 0x0000
+				0x01000080 0x0000
+				0x01000081 0x0000
+				0x01000082 0x0000
+				0x01000083 0x0000
+				0x01000084 0x0000
+				0x01000085 0x0000
+				0x01000090 0x0010
+				0x01000092 0x0000
+				0x01000093 0x0003
+				0x01000095 0x0110
+				0x01000097 0x0000
+				0x01000098 0x0000
+				0x01000007 0x0133
+				0x01000020 0x0000
+				0x01000021 0x0000
+				0x02000064>;
+			startbyte = <0x70>;
+			bgr;
+			fps = <50>;
+			gamma = "04 1F 4 7 7 0 7 7 6 0\n0F 00 1 7 4 0 0 0 6 7";
+		};
+	};
+
+	/* itdb28_spi */
+	fragment@14 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ilitek,ili9325";
+			spi-max-frequency = <32000000>;
+			bgr;
+		};
+	};
+
+	/* mi0283qt-2 */
+	fragment@15 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "himax,hx8347d";
+			spi-max-frequency = <32000000>;
+			startbyte = <0x70>;
+			bgr;
+		};
+	};
+
+	/* mi0283qt-9a */
+	fragment@16 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ilitek,ili9341";
+			spi-max-frequency = <32000000>;
+			buswidth = <9>;
+			bgr;
+		};
+	};
+
+	/* nokia3310 */
+	fragment@17 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "philips,pcd8544";
+			spi-max-frequency = <400000>;
+		};
+	};
+
+	/* nokia3310a */
+	fragment@18 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "teralane,tls8204";
+			spi-max-frequency = <1000000>;
+		};
+	};
+
+	/* nokia5110 */
+	fragment@19 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ilitek,ili9163";
+			spi-max-frequency = <12000000>;
+			bgr;
+		};
+	};
+
+	/* piscreen */
+	fragment@20 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ilitek,ili9486";
+			spi-max-frequency = <32000000>;
+			regwidth = <16>;
+			bgr;
+		};
+	};
+
+	/* pitft */
+	fragment@21 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ilitek,ili9340";
+			spi-max-frequency = <32000000>;
+			init = <0x01000001
+				0x02000005
+				0x01000028
+				0x010000EF 0x03 0x80 0x02
+				0x010000CF 0x00 0xC1 0x30
+				0x010000ED 0x64 0x03 0x12 0x81
+				0x010000E8 0x85 0x00 0x78
+				0x010000CB 0x39 0x2C 0x00 0x34 0x02
+				0x010000F7 0x20
+				0x010000EA 0x00 0x00
+				0x010000C0 0x23
+				0x010000C1 0x10
+				0x010000C5 0x3E 0x28
+				0x010000C7 0x86
+				0x0100003A 0x55
+				0x010000B1 0x00 0x18
+				0x010000B6 0x08 0x82 0x27
+				0x010000F2 0x00
+				0x01000026 0x01
+				0x010000E0 0x0F 0x31 0x2B 0x0C 0x0E 0x08 0x4E 0xF1 0x37 0x07 0x10 0x03 0x0E 0x09 0x00
+				0x010000E1 0x00 0x0E 0x14 0x03 0x11 0x07 0x31 0xC1 0x48 0x08 0x0F 0x0C 0x31 0x36 0x0F
+				0x01000011
+				0x02000064
+				0x01000029
+				0x02000014>;
+			bgr;
+		};
+	};
+
+	/* pioled */
+	fragment@22 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "solomon,ssd1351";
+			spi-max-frequency = <20000000>;
+			bgr;
+			gamma = "0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4";
+		};
+	};
+
+	/* rpi-display */
+	fragment@23 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ilitek,ili9341";
+			spi-max-frequency = <32000000>;
+			bgr;
+		};
+	};
+
+	/* sainsmart18 */
+	fragment@24 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "sitronix,st7735r";
+			spi-max-frequency = <32000000>;
+		};
+	};
+
+	/* sainsmart32_spi */
+	fragment@25 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "solomon,ssd1289";
+			spi-max-frequency = <16000000>;
+			bgr;
+		};
+	};
+
+	/* tinylcd35 */
+	fragment@26 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "neosec,tinylcd";
+			spi-max-frequency = <32000000>;
+			bgr;
+		};
+	};
+
+	/* tm022hdh26 */
+	fragment@27 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ilitek,ili9341";
+			spi-max-frequency = <32000000>;
+			bgr;
+		};
+	};
+
+	/* tontec35_9481 - boards before 02 July 2014 */
+	fragment@28 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ilitek,ili9481";
+			spi-max-frequency = <128000000>;
+			spi-cpha;
+			spi-cpol;
+			bgr;
+		};
+	};
+
+	/* tontec35_9486 - boards after 02 July 2014 */
+	fragment@29 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ilitek,ili9486";
+			spi-max-frequency = <128000000>;
+			spi-cpha;
+			spi-cpol;
+			bgr;
+		};
+	};
+
+	/* waveshare32b */
+	fragment@30 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "ilitek,ili9340";
+			spi-max-frequency = <48000000>;
+			init = <0x010000CB 0x39 0x2C 0x00 0x34 0x02
+				0x010000CF 0x00 0xC1 0x30
+				0x010000E8 0x85 0x00 0x78
+				0x010000EA 0x00 0x00
+				0x010000ED 0x64 0x03 0x12 0x81
+				0x010000F7 0x20
+				0x010000C0 0x23
+				0x010000C1 0x10
+				0x010000C5 0x3E 0x28
+				0x010000C7 0x86
+				0x01000036 0x28
+				0x0100003A 0x55
+				0x010000B1 0x00 0x18
+				0x010000B6 0x08 0x82 0x27
+				0x010000F2 0x00
+				0x01000026 0x01
+				0x010000E0 0x0F 0x31 0x2B 0x0C 0x0E 0x08 0x4E 0xF1 0x37 0x07 0x10 0x03 0x0E 0x09 0x00
+				0x010000E1 0x00 0x0E 0x14 0x03 0x11 0x07 0x31 0xC1 0x48 0x08 0x0F 0x0C 0x31 0x36 0x0F
+				0x01000011
+				0x02000078
+				0x01000029
+				0x0100002C>;
+			bgr;
+		};
+	};
+
+	/* waveshare22 */
+	fragment@31 {
+		target = <&display>;
+		__dormant__ {
+			compatible = "hitachi,bd663474";
+			spi-max-frequency = <32000000>;
+			spi-cpha;
+			spi-cpol;
+		};
+	};
+
+	spidev_fragment: fragment@100 {
+		target-path = "spi0/spidev@0";
+		__overlay__ {
+			status = "disabled";
+		};
+	};
+
+	display_fragment: fragment@101 {
+		target = <&spi0>;
+		__overlay__ {
+			/* needed to avoid dtc warning */
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			status = "okay";
+
+			display: display@0{
+				reg = <0>;
+				spi-max-frequency = <32000000>;
+				fps = <30>;
+				buswidth = <8>;
+			};
+		};
+	};
+
+	__overrides__ {
+		spi0-0        = <&display_fragment>, "target:0=",<&spi0>,
+				<&spidev_fragment>, "target-path=spi0/spidev@0",
+				<&display>, "reg:0=0";
+		spi0-1        = <&display_fragment>, "target:0=",<&spi0>,
+				<&spidev_fragment>, "target-path=spi0/spidev@1",
+				<&display>, "reg:0=1";
+		spi1-0        = <&display_fragment>, "target:0=",<&spi1>,
+				<&spidev_fragment>, "target-path=spi1/spidev@0",
+				<&display>, "reg:0=0";
+		spi1-1        = <&display_fragment>, "target:0=",<&spi1>,
+				<&spidev_fragment>, "target-path=spi1/spidev@1",
+				<&display>, "reg:0=1";
+		spi1-2        = <&display_fragment>, "target:0=",<&spi1>,
+				<&spidev_fragment>, "target-path=spi1/spidev@2",
+				<&display>, "reg:0=2";
+		spi2-0        = <&display_fragment>, "target:0=",<&spi2>,
+				<&spidev_fragment>, "target-path=spi2/spidev@0",
+				<&display>, "reg:0=0";
+		spi2-1        = <&display_fragment>, "target:0=",<&spi2>,
+				<&spidev_fragment>, "target-path=spi2/spidev@1",
+				<&display>, "reg:0=1";
+		spi2-2        = <&display_fragment>, "target:0=",<&spi2>,
+				<&spidev_fragment>, "target-path=spi2/spidev@2",
+				<&display>, "reg:0=2";
+
+		speed         = <&display>, "spi-max-frequency:0";
+		cpha          = <&display>, "spi-cpha?";
+		cpol          = <&display>, "spi-cpol?";
+
+		/* Displays */
+		adafruit18    = <0>, "+0";
+		adafruit22    = <0>, "+1";
+		adafruit22a   = <0>, "+2";
+		adafruit28    = <0>, "+3";
+		adafruit13m   = <0>, "+4";
+		admatec_c-berry28 = <0>, "+5";
+		dogs102       = <0>, "+6";
+		er_tftm050_2  = <0>, "+7";
+		er_tftm070_5  = <0>, "+8";
+		ew24ha0       = <0>, "+9";
+		ew24ha0_9bit  = <0>, "+10";
+		freetronicsoled128 = <0>, "+11";
+		hy28a         = <0>, "+12";
+		hy28b         = <0>, "+13";
+		itdb28_spi    = <0>, "+14";
+		mi0283qt-2    = <0>, "+15";
+		mi0283qt-9a   = <0>, "+16";
+		nokia3310     = <0>, "+17";
+		nokia3310a    = <0>, "+18";
+		nokia5110     = <0>, "+19";
+		piscreen      = <0>, "+20";
+		pitft         = <0>, "+21";
+		pioled        = <0>, "+22";
+		rpi-display   = <0>, "+23";
+		sainsmart18   = <0>, "+24";
+		sainsmart32_spi = <0>, "+25";
+		tinylcd35     = <0>, "+26";
+		tm022hdh26    = <0>, "+27";
+		tontec35_9481 = <0>, "+28";
+		tontec35_9486 = <0>, "+29";
+		waveshare32b  = <0>, "+30";
+		waveshare22   = <0>, "+31";
+
+		/* Controllers */
+		bd663474      = <&display>, "compatible=hitachi,bd663474";
+		hx8340bn      = <&display>, "compatible=himax,hx8340bn";
+		hx8347d       = <&display>, "compatible=himax,hx8347d";
+		hx8353d       = <&display>, "compatible=himax,hx8353d";
+		hx8357d       = <&display>, "compatible=himax,hx8357d";
+		ili9163       = <&display>, "compatible=ilitek,ili9163";
+		ili9320       = <&display>, "compatible=ilitek,ili9320";
+		ili9325       = <&display>, "compatible=ilitek,ili9325";
+		ili9340       = <&display>, "compatible=ilitek,ili9340";
+		ili9341       = <&display>, "compatible=ilitek,ili9341";
+		ili9481       = <&display>, "compatible=ilitek,ili9481";
+		ili9486       = <&display>, "compatible=ilitek,ili9486";
+		pcd8544       = <&display>, "compatible=philips,pcd8544";
+		ra8875        = <&display>, "compatible=raio,ra8875";
+		s6d02a1       = <&display>, "compatible=samsung,s6d02a1";
+		s6d1121       = <&display>, "compatible=samsung,s6d1121";
+		seps525       = <&display>, "compatible=syncoam,seps525";
+		sh1106        = <&display>, "compatible=sinowealth,sh1106";
+		ssd1289       = <&display>, "compatible=solomon,ssd1289";
+		ssd1305       = <&display>, "compatible=solomon,ssd1305";
+		ssd1306       = <&display>, "compatible=solomon,ssd1306";
+		ssd1325       = <&display>, "compatible=solomon,ssd1325";
+		ssd1331       = <&display>, "compatible=solomon,ssd1331";
+		ssd1351       = <&display>, "compatible=solomon,ssd1351";
+		st7735r       = <&display>, "compatible=sitronix,st7735r";
+		st7789v       = <&display>, "compatible=sitronix,st7789v";
+		tls8204       = <&display>, "compatible=teralane,tls8204";
+		uc1611        = <&display>, "compatible=ultrachip,uc1611";
+		uc1701        = <&display>, "compatible=UltraChip,uc1701";
+		upd161704     = <&display>, "compatible=nec,upd161704";
+
+		width         = <&display>, "width:0";
+		height        = <&display>, "height:0";
+		regwidth      = <&display>, "regwidth:0";
+		buswidth      = <&display>, "buswidth:0";
+		debug         = <&display>, "debug:0";
+		rotate        = <&display>, "rotate:0";
+		bgr           = <&display>, "bgr?";
+		fps           = <&display>, "fps:0";
+		txbuflen      = <&display>, "txbuflen:0";
+		startbyte     = <&display>, "startbyte:0";
+		gamma         = <&display>, "gamma";
+
+		reset_pin     = <&display>, "reset-gpios:0=", <&gpio>,
+				<&display>, "reset-gpios:4",
+				<&display>, "reset-gpios:8=1"; /* GPIO_ACTIVE_LOW */
+		dc_pin        = <&display>, "dc-gpios:0=", <&gpio>,
+				<&display>, "dc-gpios:4",
+				<&display>, "dc-gpios:8=0"; /* GPIO_ACTIVE_HIGH */
+		led_pin       = <&display>, "led-gpios:0=", <&gpio>,
+				<&display>, "led-gpios:4",
+				<&display>, "led-gpios:8=0"; /* GPIO_ACTIVE_HIGH */
+	};
+};