From e1195cca2a4ff06378e3775536688b63cd004dd9 Mon Sep 17 00:00:00 2001 From: Suguru Saito Date: Sun, 3 Oct 2021 20:48:29 +0900 Subject: [PATCH 1/5] spi: spi-mxs: add support 9-16 bits per word transfer --- drivers/spi/spi-mxs.c | 45 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/drivers/spi/spi-mxs.c b/drivers/spi/spi-mxs.c index 34856c9ad931..7939fd06c0cf 100644 --- a/drivers/spi/spi-mxs.c +++ b/drivers/spi/spi-mxs.c @@ -68,6 +68,13 @@ static int mxs_spi_setup_transfer(struct spi_device *dev, struct mxs_ssp *ssp = &spi->ssp; const unsigned int hz = min(dev->max_speed_hz, t->speed_hz); + if (t->bits_per_word > 8) { + if (t->len & 1) { + dev_err(&dev->dev, "Invalid size of rx and tx buffers\n"); + return -EINVAL; + } + } + if (hz == 0) { dev_err(&dev->dev, "SPI clock rate of zero not allowed\n"); return -EINVAL; @@ -91,7 +98,7 @@ static int mxs_spi_setup_transfer(struct spi_device *dev, ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET); writel(BF_SSP_CTRL1_SSP_MODE(BV_SSP_CTRL1_SSP_MODE__SPI) | - BF_SSP_CTRL1_WORD_LENGTH(BV_SSP_CTRL1_WORD_LENGTH__EIGHT_BITS) | + BF_SSP_CTRL1_WORD_LENGTH(t->bits_per_word - 1) | ((dev->mode & SPI_CPOL) ? BM_SSP_CTRL1_POLARITY : 0) | ((dev->mode & SPI_CPHA) ? BM_SSP_CTRL1_PHASE : 0), ssp->base + HW_SSP_CTRL1(ssp)); @@ -297,14 +304,18 @@ err_mapped: } static int mxs_spi_txrx_pio(struct mxs_spi *spi, - unsigned char *buf, int len, + unsigned char *buf, int len, u8 bit_per_word, unsigned int flags) { struct mxs_ssp *ssp = &spi->ssp; + u32 val; writel(BM_SSP_CTRL0_IGNORE_CRC, ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR); + if (bit_per_word > 8) + len /= 2; + while (len--) { if (len == 0 && (flags & TXRX_DEASSERT_CS)) writel(BM_SSP_CTRL0_IGNORE_CRC, @@ -332,8 +343,14 @@ static int mxs_spi_txrx_pio(struct mxs_spi *spi, if (mxs_ssp_wait(spi, HW_SSP_CTRL0, BM_SSP_CTRL0_RUN, 1)) return -ETIMEDOUT; - if (flags & TXRX_WRITE) - writel(*buf, ssp->base + HW_SSP_DATA(ssp)); + if (flags & TXRX_WRITE) { + if (bit_per_word > 8) + val = *(u16*)(buf); + else + val = *buf; + + writel(val, ssp->base + HW_SSP_DATA(ssp)); + } writel(BM_SSP_CTRL0_DATA_XFER, ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET); @@ -343,13 +360,21 @@ static int mxs_spi_txrx_pio(struct mxs_spi *spi, BM_SSP_STATUS_FIFO_EMPTY, 0)) return -ETIMEDOUT; - *buf = (readl(ssp->base + HW_SSP_DATA(ssp)) & 0xff); + val = readl(ssp->base + HW_SSP_DATA(ssp)); + + if (bit_per_word > 8) + *(u16*)buf = val & ((1 << bit_per_word) - 1); + else + *buf = val & 0xff; } if (mxs_ssp_wait(spi, HW_SSP_CTRL0, BM_SSP_CTRL0_RUN, 0)) return -ETIMEDOUT; - buf++; + if (bit_per_word > 8) + buf += 2; + else + buf++; } if (len <= 0) @@ -401,11 +426,13 @@ static int mxs_spi_transfer_one(struct spi_master *master, if (t->tx_buf) status = mxs_spi_txrx_pio(spi, - (void *)t->tx_buf, - t->len, flag | TXRX_WRITE); + (void *)t->tx_buf, t->len, + t->bits_per_word, + flag | TXRX_WRITE); if (t->rx_buf) status = mxs_spi_txrx_pio(spi, t->rx_buf, t->len, + t->bits_per_word, flag); } else { writel(BM_SSP_CTRL1_DMA_ENABLE, @@ -569,7 +596,7 @@ static int mxs_spi_probe(struct platform_device *pdev) platform_set_drvdata(pdev, master); master->transfer_one_message = mxs_spi_transfer_one; - master->bits_per_word_mask = SPI_BPW_MASK(8); + master->bits_per_word_mask = SPI_BPW_RANGE_MASK(8, 16); master->mode_bits = SPI_CPOL | SPI_CPHA; master->num_chipselect = 3; master->dev.of_node = np; From eecf83c04c26cb9d4cb486409fac418fe1dde2f0 Mon Sep 17 00:00:00 2001 From: Suguru Saito Date: Sun, 3 Oct 2021 20:52:12 +0900 Subject: [PATCH 2/5] drm: add support Sharp Brain 2nd generation SubLCD --- drivers/gpu/drm/tiny/Kconfig | 12 ++++++++++++ drivers/gpu/drm/tiny/Makefile | 1 + 2 files changed, 13 insertions(+) diff --git a/drivers/gpu/drm/tiny/Kconfig b/drivers/gpu/drm/tiny/Kconfig index d093083595d7..5b30e205105d 100644 --- a/drivers/gpu/drm/tiny/Kconfig +++ b/drivers/gpu/drm/tiny/Kconfig @@ -108,6 +108,18 @@ config TINYDRM_ST7586 If M is selected the module will be called st7586. +config TINYDRM_BRAIN_ST7586 + tristate "DRM support for Sitronix ST7586 display panels on Sharp Brain" + depends on DRM && SPI + select DRM_KMS_HELPER + select DRM_KMS_CMA_HELPER + select DRM_MIPI_DBI + help + DRM driver for the following Sitronix ST7586 panels: + * Sharp Brain 240x120 LCD + + If M is selected the module will be called brain-st7586. + config TINYDRM_ST7735R tristate "DRM support for Sitronix ST7735R display panels" depends on DRM && SPI diff --git a/drivers/gpu/drm/tiny/Makefile b/drivers/gpu/drm/tiny/Makefile index a7c1962c6564..2712edeeab11 100644 --- a/drivers/gpu/drm/tiny/Makefile +++ b/drivers/gpu/drm/tiny/Makefile @@ -9,4 +9,5 @@ obj-$(CONFIG_TINYDRM_BRAIN_2G) += brain-lq050j1ug01.o obj-$(CONFIG_TINYDRM_MI0283QT) += mi0283qt.o obj-$(CONFIG_TINYDRM_REPAPER) += repaper.o obj-$(CONFIG_TINYDRM_ST7586) += st7586.o +obj-$(CONFIG_TINYDRM_BRAIN_ST7586) += brain-st7586.o obj-$(CONFIG_TINYDRM_ST7735R) += st7735r.o From e90722da178abfe77f5734f30f336280aa8d73a9 Mon Sep 17 00:00:00 2001 From: Suguru Saito Date: Sun, 3 Oct 2021 20:53:18 +0900 Subject: [PATCH 3/5] arm: brain: add SubLCD support for 2nd generation --- arch/arm/boot/dts/imx28-brain-2g.dtsi | 29 +++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/arch/arm/boot/dts/imx28-brain-2g.dtsi b/arch/arm/boot/dts/imx28-brain-2g.dtsi index 1d89780223bf..a24d6575d4b9 100644 --- a/arch/arm/boot/dts/imx28-brain-2g.dtsi +++ b/arch/arm/boot/dts/imx28-brain-2g.dtsi @@ -95,6 +95,22 @@ status = "okay"; }; + ssp2: spi@80014000 { + compatible = "fsl,imx28-spi"; + pinctrl-names = "default"; + pinctrl-0 = <&slcd_pins>; + clock-frequency = <16000000>; + status = "okay"; + + slcd@0 { + reg = <0>; + compatible = "brain,st7586"; + spi-max-frequency = <16000000>; + reset-gpios = <&gpio2 18 GPIO_ACTIVE_HIGH>; + rotation = <180>; + }; + }; + pinctrl@80018000 { pinctrl-names = "default"; pinctrl-0 = <&hog_pins_3v3_pullup &hog_pins_3v3_nopull &hog_pins_1v8_nopull>; @@ -177,6 +193,19 @@ fsl,voltage = ; fsl,pull-up = ; }; + + slcd_pins: spi2@0 { + reg = <0>; + fsl,pinmux-ids = < + MX28_PAD_SSP2_SCK__SSP2_SCK + MX28_PAD_SSP2_MOSI__SSP2_CMD + MX28_PAD_SSP2_MISO__GPIO_2_18 + MX28_PAD_SSP2_SS0__SSP2_D3 + >; + fsl,drive-strength = ; + fsl,voltage = ; + fsl,pull-up = ; + }; }; brainlcd: lcdif@80030000 { From 3fe5b06bcf79e9c9653c932fd636b1d6a27d0136 Mon Sep 17 00:00:00 2001 From: Suguru Saito Date: Sun, 3 Oct 2021 20:54:50 +0900 Subject: [PATCH 4/5] arm: brain: add support SubLCD backlight for 2nd generation --- arch/arm/boot/dts/imx28-brain-2g.dtsi | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/imx28-brain-2g.dtsi b/arch/arm/boot/dts/imx28-brain-2g.dtsi index a24d6575d4b9..3b688935bbf3 100644 --- a/arch/arm/boot/dts/imx28-brain-2g.dtsi +++ b/arch/arm/boot/dts/imx28-brain-2g.dtsi @@ -156,6 +156,7 @@ fsl,pinmux-ids = < MX28_PAD_AUART1_RX__PWM_0 MX28_PAD_AUART1_TX__PWM_1 + MX28_PAD_PWM2__PWM_2 MX28_PAD_PWM4__PWM_4 MX28_PAD_SAIF1_SDATA0__GPIO_3_26 >; @@ -313,13 +314,20 @@ audio-codec = <&sgtl5000>; }; - backlight_display: backlight { + backlight_display: backlight@0 { compatible = "pwm-backlight"; pwms = <&pwm 0 50000>, <&pwm 1 50000>; brightness-levels = <0 4 8 16 32 64 128 255>; default-brightness-level = <4>; //Set 4 for identification on probing }; + slcd_backlight: backlight@1 { + compatible = "pwm-backlight"; + pwms = <&pwm 2 50000>; + brightness-levels = <0 63 127 255>; + default-brightness-level = <3>; + }; + buzzer_cold: buzzer_cold { compatible = "regulator-fixed"; regulator-name = "fixed-supply"; From d94bc6d2e169d73df64117591eb61027a2a358b0 Mon Sep 17 00:00:00 2001 From: Suguru Saito Date: Mon, 4 Oct 2021 12:22:07 +0900 Subject: [PATCH 5/5] drm: add st7586 driver for Sharp Brain 2nd generation SubLCD --- drivers/gpu/drm/tiny/brain-st7586.c | 443 ++++++++++++++++++++++++++++ 1 file changed, 443 insertions(+) create mode 100644 drivers/gpu/drm/tiny/brain-st7586.c diff --git a/drivers/gpu/drm/tiny/brain-st7586.c b/drivers/gpu/drm/tiny/brain-st7586.c new file mode 100644 index 000000000000..ced526ca3cfb --- /dev/null +++ b/drivers/gpu/drm/tiny/brain-st7586.c @@ -0,0 +1,443 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * DRM driver for Sitronix ST7586 panels for Brain 2nd SubLCD + * + * Copyright 2021 Suguru Saito + * + * based on st7586.c + * Copyright 2017 David Lechner + */ + +#include +#include +#include +#include +#include +#include +#include