* [PATCH 0/3] Add startek-kd070fhfid015 display support
@ 2023-07-11 15:36 Alexandre Mergnat
2023-07-11 15:36 ` [PATCH 1/3] dt-bindings: display: panel: add startek kd070fhfid015 support Alexandre Mergnat
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Alexandre Mergnat @ 2023-07-11 15:36 UTC (permalink / raw)
To: Neil Armstrong, Sam Ravnborg, David Airlie, Daniel Vetter,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Catalin Marinas,
Will Deacon
Cc: Guillaume La Roque, dri-devel, devicetree, linux-kernel,
linux-arm-kernel, Alexandre Mergnat
Add the support of the Startek KD070FHFID015 panel.
It's a 7-inch TFT LCD display with a resolution of 1024 x 600 pixels.
This serie come from a bigger one [1]. Then I addressed the previous
comments for the related commits here.
Changes in v1:
- Fix typos in the driver.
- Merge 2 regulators in one bulk variable in the driver.
- Remove backlight enable/disable from the driver because it's already
managed by the backlight core.
- Move hardcoded values from function to the generic structure in the
driver.
- Remove unnecessary function (stk_panel_del).
- Replace some functions by macro to increase the readability.
- Link to parent serie: [1]
[1]: https://lore.kernel.org/all/20230220-display-v1-0-45cbc68e188b@baylibre.com/
Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com>
---
Alexandre Mergnat (2):
dt-bindings: display: panel: add startek kd070fhfid015 support
arm64: defconfig: enable STARTEK KD070FHFID015 panel
Guillaume La Roque (1):
drm/panel: Support for startek-kd070fhfid015 MIPI-DSI panel
.../display/panel/startek,kd070fhfid015.yaml | 51 +++
arch/arm64/configs/defconfig | 1 +
drivers/gpu/drm/panel/Kconfig | 11 +
drivers/gpu/drm/panel/Makefile | 1 +
.../gpu/drm/panel/panel-startek-kd070fhfid015.c | 434 +++++++++++++++++++++
5 files changed, 498 insertions(+)
---
base-commit: 06c2afb862f9da8dc5efa4b6076a0e48c3fbaaa5
change-id: 20230711-startek_display-958d265f6baa
Best regards,
--
Alexandre Mergnat <amergnat@baylibre.com>
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH 1/3] dt-bindings: display: panel: add startek kd070fhfid015 support 2023-07-11 15:36 [PATCH 0/3] Add startek-kd070fhfid015 display support Alexandre Mergnat @ 2023-07-11 15:36 ` Alexandre Mergnat 2023-07-11 18:24 ` Conor Dooley 2023-07-12 5:32 ` Krzysztof Kozlowski 2023-07-11 15:36 ` [PATCH 2/3] drm/panel: Support for startek-kd070fhfid015 MIPI-DSI panel amergnat 2023-07-11 15:36 ` [PATCH 3/3] arm64: defconfig: enable STARTEK KD070FHFID015 panel Alexandre Mergnat 2 siblings, 2 replies; 8+ messages in thread From: Alexandre Mergnat @ 2023-07-11 15:36 UTC (permalink / raw) To: Neil Armstrong, Sam Ravnborg, David Airlie, Daniel Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Catalin Marinas, Will Deacon Cc: Guillaume La Roque, dri-devel, devicetree, linux-kernel, linux-arm-kernel, Alexandre Mergnat The Startek KD070FHFID015 is a 7-inch TFT LCD display with a resolution of 1024 x 600 pixels. Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com> --- .../display/panel/startek,kd070fhfid015.yaml | 51 ++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/Documentation/devicetree/bindings/display/panel/startek,kd070fhfid015.yaml b/Documentation/devicetree/bindings/display/panel/startek,kd070fhfid015.yaml new file mode 100644 index 000000000000..857658e002fd --- /dev/null +++ b/Documentation/devicetree/bindings/display/panel/startek,kd070fhfid015.yaml @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/panel/startek,kd070fhfid015.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Startek Electronic Technology Co. kd070fhfid015 7 inch TFT LCD panel + +maintainers: + - Alexandre Mergnat <amergnat@baylibre.com> + +allOf: + - $ref: panel-common.yaml# + +properties: + compatible: + const: startek,kd070fhfid015 + + dcdc-gpios: true + + height-mm: + const: 151 + + iovcc-supply: + description: Reference to the regulator powering the panel IO pins. + + reg: + maxItems: 1 + description: DSI virtual channel + + reset-gpios: true + + port: true + + power-supply: true + + width-mm: + const: 95 + +additionalProperties: false + +required: + - compatible + - dcdc-gpios + - iovcc-supply + - reg + - reset-gpios + - port + - power-supply + +... -- 2.25.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] dt-bindings: display: panel: add startek kd070fhfid015 support 2023-07-11 15:36 ` [PATCH 1/3] dt-bindings: display: panel: add startek kd070fhfid015 support Alexandre Mergnat @ 2023-07-11 18:24 ` Conor Dooley 2023-07-12 5:32 ` Krzysztof Kozlowski 1 sibling, 0 replies; 8+ messages in thread From: Conor Dooley @ 2023-07-11 18:24 UTC (permalink / raw) To: Alexandre Mergnat Cc: Neil Armstrong, Sam Ravnborg, David Airlie, Daniel Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Catalin Marinas, Will Deacon, Guillaume La Roque, dri-devel, devicetree, linux-kernel, linux-arm-kernel [-- Attachment #1: Type: text/plain, Size: 1772 bytes --] On Tue, Jul 11, 2023 at 05:36:27PM +0200, Alexandre Mergnat wrote: > The Startek KD070FHFID015 is a 7-inch TFT LCD display with a resolution > of 1024 x 600 pixels. > > Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com> > --- > .../display/panel/startek,kd070fhfid015.yaml | 51 ++++++++++++++++++++++ > 1 file changed, 51 insertions(+) > > diff --git a/Documentation/devicetree/bindings/display/panel/startek,kd070fhfid015.yaml b/Documentation/devicetree/bindings/display/panel/startek,kd070fhfid015.yaml > new file mode 100644 > index 000000000000..857658e002fd > --- /dev/null > +++ b/Documentation/devicetree/bindings/display/panel/startek,kd070fhfid015.yaml > @@ -0,0 +1,51 @@ > +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/display/panel/startek,kd070fhfid015.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Startek Electronic Technology Co. kd070fhfid015 7 inch TFT LCD panel > + > +maintainers: > + - Alexandre Mergnat <amergnat@baylibre.com> > + > +allOf: > + - $ref: panel-common.yaml# > + > +properties: > + compatible: > + const: startek,kd070fhfid015 > + > + dcdc-gpios: true > + > + height-mm: > + const: 151 Are height-mm and width-mm useful if they are always a fixed value? Otherwise, it looks grand to me, Reviewed-by: Conor Dooley <conor.dooley@microchip.com> Cheers, Conor. > + > + iovcc-supply: > + description: Reference to the regulator powering the panel IO pins. > + > + reg: > + maxItems: 1 > + description: DSI virtual channel nit: usually reg gets sorted after compatible, even if everything else is in alphabetical order, but hardly important. [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] dt-bindings: display: panel: add startek kd070fhfid015 support 2023-07-11 15:36 ` [PATCH 1/3] dt-bindings: display: panel: add startek kd070fhfid015 support Alexandre Mergnat 2023-07-11 18:24 ` Conor Dooley @ 2023-07-12 5:32 ` Krzysztof Kozlowski 2023-07-12 8:01 ` Alexandre Mergnat 1 sibling, 1 reply; 8+ messages in thread From: Krzysztof Kozlowski @ 2023-07-12 5:32 UTC (permalink / raw) To: Alexandre Mergnat, Neil Armstrong, Sam Ravnborg, David Airlie, Daniel Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Catalin Marinas, Will Deacon Cc: Guillaume La Roque, dri-devel, devicetree, linux-kernel, linux-arm-kernel On 11/07/2023 17:36, Alexandre Mergnat wrote: > The Startek KD070FHFID015 is a 7-inch TFT LCD display with a resolution > of 1024 x 600 pixels. > > Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com> > --- > .../display/panel/startek,kd070fhfid015.yaml | 51 ++++++++++++++++++++++ > 1 file changed, 51 insertions(+) > > diff --git a/Documentation/devicetree/bindings/display/panel/startek,kd070fhfid015.yaml b/Documentation/devicetree/bindings/display/panel/startek,kd070fhfid015.yaml > new file mode 100644 > index 000000000000..857658e002fd > --- /dev/null > +++ b/Documentation/devicetree/bindings/display/panel/startek,kd070fhfid015.yaml > @@ -0,0 +1,51 @@ > +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/display/panel/startek,kd070fhfid015.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Startek Electronic Technology Co. kd070fhfid015 7 inch TFT LCD panel > + > +maintainers: > + - Alexandre Mergnat <amergnat@baylibre.com> > + > +allOf: > + - $ref: panel-common.yaml# > + > +properties: > + compatible: > + const: startek,kd070fhfid015 > + > + dcdc-gpios: true From where does this come? Which schema defines it? > + > + height-mm: > + const: 151 > + > + iovcc-supply: > + description: Reference to the regulator powering the panel IO pins. > + > + reg: > + maxItems: 1 > + description: DSI virtual channel > + > + reset-gpios: true > + > + port: true > + > + power-supply: true > + > + width-mm: > + const: 95 > + > +additionalProperties: false > + > +required: > + - compatible > + - dcdc-gpios > + - iovcc-supply > + - reg > + - reset-gpios > + - port > + - power-supply Missing example. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] dt-bindings: display: panel: add startek kd070fhfid015 support 2023-07-12 5:32 ` Krzysztof Kozlowski @ 2023-07-12 8:01 ` Alexandre Mergnat 2023-07-12 8:23 ` Krzysztof Kozlowski 0 siblings, 1 reply; 8+ messages in thread From: Alexandre Mergnat @ 2023-07-12 8:01 UTC (permalink / raw) To: Krzysztof Kozlowski, Neil Armstrong, Sam Ravnborg, David Airlie, Daniel Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Catalin Marinas, Will Deacon Cc: Guillaume La Roque, dri-devel, devicetree, linux-kernel, linux-arm-kernel Hi Krzysztof, Thanks for your review On 12/07/2023 07:32, Krzysztof Kozlowski wrote: > On 11/07/2023 17:36, Alexandre Mergnat wrote: >> The Startek KD070FHFID015 is a 7-inch TFT LCD display with a resolution snip >> + >> + dcdc-gpios: true > > From where does this come? Which schema defines it? It's a miss. I will fix it and reset-gpios too by adding a maxItems and a description. >> + >> + height-mm: >> + const: 151 >> + >> + iovcc-supply: >> + description: Reference to the regulator powering the panel IO pins. >> + >> + reg: >> + maxItems: 1 >> + description: DSI virtual channel >> + >> + reset-gpios: true >> + >> + port: true >> + >> + power-supply: true >> + >> + width-mm: >> + const: 95 >> + >> +additionalProperties: false >> + >> +required: >> + - compatible >> + - dcdc-gpios >> + - iovcc-supply >> + - reg >> + - reset-gpios >> + - port >> + - power-supply > > Missing example. I will add it. -- Regards, Alexandre ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] dt-bindings: display: panel: add startek kd070fhfid015 support 2023-07-12 8:01 ` Alexandre Mergnat @ 2023-07-12 8:23 ` Krzysztof Kozlowski 0 siblings, 0 replies; 8+ messages in thread From: Krzysztof Kozlowski @ 2023-07-12 8:23 UTC (permalink / raw) To: Alexandre Mergnat, Neil Armstrong, Sam Ravnborg, David Airlie, Daniel Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Catalin Marinas, Will Deacon Cc: Guillaume La Roque, dri-devel, devicetree, linux-kernel, linux-arm-kernel On 12/07/2023 10:01, Alexandre Mergnat wrote: > Hi Krzysztof, > > Thanks for your review > > On 12/07/2023 07:32, Krzysztof Kozlowski wrote: >> On 11/07/2023 17:36, Alexandre Mergnat wrote: >>> The Startek KD070FHFID015 is a 7-inch TFT LCD display with a resolution > > snip > >>> + >>> + dcdc-gpios: true >> >> From where does this come? Which schema defines it? > > It's a miss. I will fix it and reset-gpios too by adding a maxItems and > a description. reset-gpios come from panel-common, so they are fine. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/3] drm/panel: Support for startek-kd070fhfid015 MIPI-DSI panel 2023-07-11 15:36 [PATCH 0/3] Add startek-kd070fhfid015 display support Alexandre Mergnat 2023-07-11 15:36 ` [PATCH 1/3] dt-bindings: display: panel: add startek kd070fhfid015 support Alexandre Mergnat @ 2023-07-11 15:36 ` amergnat 2023-07-11 15:36 ` [PATCH 3/3] arm64: defconfig: enable STARTEK KD070FHFID015 panel Alexandre Mergnat 2 siblings, 0 replies; 8+ messages in thread From: amergnat @ 2023-07-11 15:36 UTC (permalink / raw) To: Neil Armstrong, Sam Ravnborg, David Airlie, Daniel Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Catalin Marinas, Will Deacon Cc: Guillaume La Roque, dri-devel, devicetree, linux-kernel, linux-arm-kernel, Alexandre Mergnat From: Guillaume La Roque <glaroque@baylibre.com> This driver support the Startek KD070FHFID015, which is a 7-inch TFT LCD display using MIPI DSI interface. Signed-off-by: Guillaume La Roque <glaroque@baylibre.com> Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com> --- drivers/gpu/drm/panel/Kconfig | 11 + drivers/gpu/drm/panel/Makefile | 1 + .../gpu/drm/panel/panel-startek-kd070fhfid015.c | 434 +++++++++++++++++++++ 3 files changed, 446 insertions(+) diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig index 203c0ef0bbfd..c45e877c22c1 100644 --- a/drivers/gpu/drm/panel/Kconfig +++ b/drivers/gpu/drm/panel/Kconfig @@ -733,6 +733,17 @@ config DRM_PANEL_SONY_TULIP_TRULY_NT35521 NT35521 1280x720 video mode panel as found on Sony Xperia M4 Aqua phone. +config DRM_PANEL_STARTEK_KD070FHFID015 + tristate "STARTEK KD070FHFID015 panel" + depends on OF + depends on DRM_MIPI_DSI + depends on BACKLIGHT_CLASS_DEVICE + help + Say Y here if you want to enable support for STARTEK KD070FHFID015 DSI panel + based on RENESAS-R69429 controller. The pannel is a 7-inch TFT LCD display + with a resolution of 1024 x 600 pixels. It provides a MIPI DSI interface to + the host, a built-in LED backlight and touch controller. + config DRM_PANEL_TDO_TL070WSH30 tristate "TDO TL070WSH30 DSI panel" depends on OF diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile index 30cf553c8d1d..f8b362091ce7 100644 --- a/drivers/gpu/drm/panel/Makefile +++ b/drivers/gpu/drm/panel/Makefile @@ -74,6 +74,7 @@ obj-$(CONFIG_DRM_PANEL_SITRONIX_ST7789V) += panel-sitronix-st7789v.o obj-$(CONFIG_DRM_PANEL_SONY_ACX565AKM) += panel-sony-acx565akm.o obj-$(CONFIG_DRM_PANEL_SONY_TD4353_JDI) += panel-sony-td4353-jdi.o obj-$(CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521) += panel-sony-tulip-truly-nt35521.o +obj-$(CONFIG_DRM_PANEL_STARTEK_KD070FHFID015) += panel-startek-kd070fhfid015.o obj-$(CONFIG_DRM_PANEL_TDO_TL070WSH30) += panel-tdo-tl070wsh30.o obj-$(CONFIG_DRM_PANEL_TPO_TD028TTEC1) += panel-tpo-td028ttec1.o obj-$(CONFIG_DRM_PANEL_TPO_TD043MTEA1) += panel-tpo-td043mtea1.o diff --git a/drivers/gpu/drm/panel/panel-startek-kd070fhfid015.c b/drivers/gpu/drm/panel/panel-startek-kd070fhfid015.c new file mode 100644 index 000000000000..a9f030a292af --- /dev/null +++ b/drivers/gpu/drm/panel/panel-startek-kd070fhfid015.c @@ -0,0 +1,434 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2016 InforceComputing + * Copyright (C) 2016 Linaro Ltd + * Copyright (C) 2023 BayLibre, SAS + * + * Authors: + * - Vinay Simha BN <simhavcs@gmail.com> + * - Sumit Semwal <sumit.semwal@linaro.org> + * - Guillaume La Roque <glaroque@baylibre.com> + * + */ + +#include <linux/backlight.h> +#include <linux/delay.h> +#include <linux/gpio/consumer.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/regulator/consumer.h> + +#include <video/mipi_display.h> + +#include <drm/drm_mipi_dsi.h> +#include <drm/drm_modes.h> +#include <drm/drm_panel.h> + +#define DSI_REG_MCAP 0xB0 +#define DSI_REG_IS 0xB3 /* Interface Setting */ +#define DSI_REG_IIS 0xB4 /* Interface ID Setting */ +#define DSI_REG_CTRL 0xB6 + +enum { + IOVCC = 0, + POWER = 1 +}; + + +struct stk_panel { + struct drm_panel base; + struct mipi_dsi_device *dsi; + + struct gpio_desc *reset_gpio; /* External Reset, Low is active */ + struct gpio_desc *dcdc_en_gpio; /* Power IC supply enable, High active */ + struct backlight_device *backlight; + struct regulator_bulk_data supplies[2]; + + bool prepared; + + const struct drm_display_mode *mode; +}; + +static inline struct stk_panel *to_stk_panel(struct drm_panel *panel) +{ + return container_of(panel, struct stk_panel, base); +} + +static int stk_panel_init(struct stk_panel *stk) +{ + struct mipi_dsi_device *dsi = stk->dsi; + struct device *dev = &stk->dsi->dev; + int ret; + + ret = mipi_dsi_dcs_soft_reset(dsi); + if (ret < 0) { + dev_err(dev, "failed to mipi_dsi_dcs_soft_reset: %d\n", ret); + return ret; + } + mdelay(5); + + ret = mipi_dsi_dcs_exit_sleep_mode(dsi); + if (ret < 0) { + dev_err(dev, "failed to set exit sleep mode: %d\n", ret); + return ret; + } + msleep(120); + + mipi_dsi_generic_write_seq(dsi, DSI_REG_MCAP, 0x04); + + /* Interface setting, video mode */ + mipi_dsi_generic_write_seq(dsi, DSI_REG_IS, 0x14, 0x08, 0x00, 0x22, 0x00); + mipi_dsi_generic_write_seq(dsi, DSI_REG_IIS, 0x0C, 0x00); + mipi_dsi_generic_write_seq(dsi, DSI_REG_CTRL, 0x3A, 0xD3); + + ret = mipi_dsi_dcs_set_display_brightness(dsi, 0x77); + if (ret < 0) { + dev_err(dev, "failed to write display brightness: %d\n", ret); + return ret; + } + + mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_WRITE_CONTROL_DISPLAY, + MIPI_DCS_WRITE_MEMORY_START); + + ret = mipi_dsi_dcs_set_pixel_format(dsi, 0x77); + if (ret < 0) { + dev_err(dev, "failed to set pixel format: %d\n", ret); + return ret; + } + + ret = mipi_dsi_dcs_set_column_address(dsi, 0, stk->mode->hdisplay - 1); + if (ret < 0) { + dev_err(dev, "failed to set column address: %d\n", ret); + return ret; + } + + ret = mipi_dsi_dcs_set_page_address(dsi, 0, stk->mode->vdisplay - 1); + if (ret < 0) { + dev_err(dev, "failed to set page address: %d\n", ret); + return ret; + } + + return 0; +} + +static int stk_panel_on(struct stk_panel *stk) +{ + struct mipi_dsi_device *dsi = stk->dsi; + struct device *dev = &stk->dsi->dev; + int ret; + + ret = mipi_dsi_dcs_set_display_on(dsi); + if (ret < 0) + dev_err(dev, "failed to set display on: %d\n", ret); + + mdelay(20); + + return ret; +} + +static void stk_panel_off(struct stk_panel *stk) +{ + struct mipi_dsi_device *dsi = stk->dsi; + struct device *dev = &stk->dsi->dev; + int ret; + + dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; + + ret = mipi_dsi_dcs_set_display_off(dsi); + if (ret < 0) + dev_err(dev, "failed to set display off: %d\n", ret); + + ret = mipi_dsi_dcs_enter_sleep_mode(dsi); + if (ret < 0) + dev_err(dev, "failed to enter sleep mode: %d\n", ret); + + msleep(100); +} + +static int stk_panel_disable(struct drm_panel *panel) +{ + return 0; +} + +static int stk_panel_unprepare(struct drm_panel *panel) +{ + struct stk_panel *stk = to_stk_panel(panel); + + if (!stk->prepared) + return 0; + + stk_panel_off(stk); + regulator_bulk_disable(ARRAY_SIZE(stk->supplies), stk->supplies); + gpiod_set_value(stk->reset_gpio, 0); + gpiod_set_value(stk->dcdc_en_gpio, 1); + + stk->prepared = false; + + return 0; +} + +static int stk_panel_prepare(struct drm_panel *panel) +{ + struct stk_panel *stk = to_stk_panel(panel); + struct device *dev = &stk->dsi->dev; + int ret; + + if (stk->prepared) + return 0; + + gpiod_set_value(stk->reset_gpio, 0); + gpiod_set_value(stk->dcdc_en_gpio, 0); + ret = regulator_enable(stk->supplies[IOVCC].consumer); + if (ret < 0) + return ret; + + mdelay(8); + ret = regulator_enable(stk->supplies[POWER].consumer); + if (ret < 0) + goto iovccoff; + + mdelay(20); + gpiod_set_value(stk->dcdc_en_gpio, 1); + mdelay(20); + gpiod_set_value(stk->reset_gpio, 1); + mdelay(10); + ret = stk_panel_init(stk); + if (ret < 0) { + dev_err(dev, "failed to init panel: %d\n", ret); + goto poweroff; + } + + ret = stk_panel_on(stk); + if (ret < 0) { + dev_err(dev, "failed to set panel on: %d\n", ret); + goto poweroff; + } + + stk->prepared = true; + + return 0; + +poweroff: + regulator_disable(stk->supplies[POWER].consumer); +iovccoff: + regulator_disable(stk->supplies[IOVCC].consumer); + gpiod_set_value(stk->reset_gpio, 0); + gpiod_set_value(stk->dcdc_en_gpio, 0); + + return ret; +} + +static int stk_panel_enable(struct drm_panel *panel) +{ + return 0; +} + +static const struct drm_display_mode default_mode = { + .clock = 163204, + .hdisplay = 1200, + .hsync_start = 1200 + 144, + .hsync_end = 1200 + 144 + 16, + .htotal = 1200 + 144 + 16 + 45, + .vdisplay = 1920, + .vsync_start = 1920 + 8, + .vsync_end = 1920 + 8 + 4, + .vtotal = 1920 + 8 + 4 + 4, + .width_mm = 95, + .height_mm = 151, +}; + +static int stk_panel_get_modes(struct drm_panel *panel, + struct drm_connector *connector) +{ + struct drm_display_mode *mode; + + mode = drm_mode_duplicate(connector->dev, &default_mode); + if (!mode) { + dev_err(panel->dev, "failed to add mode %ux%ux@%u\n", + default_mode.hdisplay, default_mode.vdisplay, + drm_mode_vrefresh(&default_mode)); + return -ENOMEM; + } + + drm_mode_set_name(mode); + drm_mode_probed_add(connector, mode); + connector->display_info.width_mm = default_mode.width_mm; + connector->display_info.height_mm = default_mode.height_mm; + return 1; +} + +static int dsi_dcs_bl_get_brightness(struct backlight_device *bl) +{ + struct mipi_dsi_device *dsi = bl_get_data(bl); + int ret; + u16 brightness = bl->props.brightness; + + dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; + ret = mipi_dsi_dcs_get_display_brightness(dsi, &brightness); + if (ret < 0) + return ret; + + dsi->mode_flags |= MIPI_DSI_MODE_LPM; + return brightness & 0xff; +} + +static int dsi_dcs_bl_update_status(struct backlight_device *bl) +{ + struct mipi_dsi_device *dsi = bl_get_data(bl); + struct device *dev = &dsi->dev; + int ret; + + dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; + ret = mipi_dsi_dcs_set_display_brightness(dsi, bl->props.brightness); + if (ret < 0) { + dev_err(dev, "failed to set DSI control: %d\n", ret); + return ret; + } + + dsi->mode_flags |= MIPI_DSI_MODE_LPM; + return 0; +} + +static const struct backlight_ops dsi_bl_ops = { + .update_status = dsi_dcs_bl_update_status, + .get_brightness = dsi_dcs_bl_get_brightness, +}; + +static struct backlight_device * +drm_panel_create_dsi_backlight(struct mipi_dsi_device *dsi) +{ + struct device *dev = &dsi->dev; + struct backlight_properties props = { + .type = BACKLIGHT_RAW, + .brightness = 255, + .max_brightness = 255, + }; + + return devm_backlight_device_register(dev, dev_name(dev), dev, dsi, + &dsi_bl_ops, &props); +} + +static const struct drm_panel_funcs stk_panel_funcs = { + .disable = stk_panel_disable, + .unprepare = stk_panel_unprepare, + .prepare = stk_panel_prepare, + .enable = stk_panel_enable, + .get_modes = stk_panel_get_modes, +}; + +static const struct of_device_id stk_of_match[] = { + { .compatible = "startek,kd070fhfid015", }, + { } +}; +MODULE_DEVICE_TABLE(of, stk_of_match); + +static int stk_panel_add(struct stk_panel *stk) +{ + struct device *dev = &stk->dsi->dev; + int ret; + + stk->mode = &default_mode; + + stk->supplies[IOVCC].supply = "iovcc"; + stk->supplies[POWER].supply = "power"; + ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(stk->supplies), stk->supplies); + if (ret) { + dev_err(dev, "regulator_bulk failed\n"); + return ret; + } + + stk->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); + if (IS_ERR(stk->reset_gpio)) { + ret = PTR_ERR(stk->reset_gpio); + dev_err(dev, "cannot get reset-gpios %d\n", ret); + return ret; + } + + stk->dcdc_en_gpio = devm_gpiod_get(dev, "dcdc", GPIOD_OUT_LOW); + if (IS_ERR(stk->dcdc_en_gpio)) { + ret = PTR_ERR(stk->dcdc_en_gpio); + dev_err(dev, "cannot get dcdc-en-gpio %d\n", ret); + return ret; + } + + stk->backlight = drm_panel_create_dsi_backlight(stk->dsi); + if (IS_ERR(stk->backlight)) { + ret = PTR_ERR(stk->backlight); + dev_err(dev, "failed to register backlight %d\n", ret); + return ret; + } + + drm_panel_init(&stk->base, &stk->dsi->dev, &stk_panel_funcs, + DRM_MODE_CONNECTOR_DSI); + + drm_panel_add(&stk->base); + + return 0; +} + +static int stk_panel_probe(struct mipi_dsi_device *dsi) +{ + struct stk_panel *stk; + int ret; + + dsi->lanes = 4; + dsi->format = MIPI_DSI_FMT_RGB888; + dsi->mode_flags = (MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_LPM); + + stk = devm_kzalloc(&dsi->dev, sizeof(*stk), GFP_KERNEL); + if (!stk) + return -ENOMEM; + + mipi_dsi_set_drvdata(dsi, stk); + + stk->dsi = dsi; + + ret = stk_panel_add(stk); + if (ret < 0) + return ret; + + ret = mipi_dsi_attach(dsi); + if (ret < 0) + drm_panel_remove(&stk->base); + + return 0; +} + +static void stk_panel_remove(struct mipi_dsi_device *dsi) +{ + struct stk_panel *stk = mipi_dsi_get_drvdata(dsi); + int err; + + err = stk_panel_disable(&stk->base); + if (err < 0) + dev_err(&dsi->dev, "failed to disable panel: %d\n", err); + + err = mipi_dsi_detach(dsi); + if (err < 0) + dev_err(&dsi->dev, "failed to detach from DSI host: %d\n", + err); + + drm_panel_remove(&stk->base); +} + +static void stk_panel_shutdown(struct mipi_dsi_device *dsi) +{ + struct stk_panel *stk = mipi_dsi_get_drvdata(dsi); + + stk_panel_disable(&stk->base); +} + +static struct mipi_dsi_driver stk_panel_driver = { + .driver = { + .name = "panel-startek-kd070fhfid015", + .of_match_table = stk_of_match, + }, + .probe = stk_panel_probe, + .remove = stk_panel_remove, + .shutdown = stk_panel_shutdown, +}; +module_mipi_dsi_driver(stk_panel_driver); + +MODULE_AUTHOR("Guillaume La Roque <glaroque@baylibre.com>"); +MODULE_DESCRIPTION("STARTEK KD070FHFID015"); +MODULE_LICENSE("GPL"); -- 2.25.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/3] arm64: defconfig: enable STARTEK KD070FHFID015 panel 2023-07-11 15:36 [PATCH 0/3] Add startek-kd070fhfid015 display support Alexandre Mergnat 2023-07-11 15:36 ` [PATCH 1/3] dt-bindings: display: panel: add startek kd070fhfid015 support Alexandre Mergnat 2023-07-11 15:36 ` [PATCH 2/3] drm/panel: Support for startek-kd070fhfid015 MIPI-DSI panel amergnat @ 2023-07-11 15:36 ` Alexandre Mergnat 2 siblings, 0 replies; 8+ messages in thread From: Alexandre Mergnat @ 2023-07-11 15:36 UTC (permalink / raw) To: Neil Armstrong, Sam Ravnborg, David Airlie, Daniel Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Catalin Marinas, Will Deacon Cc: Guillaume La Roque, dri-devel, devicetree, linux-kernel, linux-arm-kernel, Alexandre Mergnat Build Startek KD070FHFID015 panel driver. This MIPI-DSI display can be used for the mt8365-evk board for example. Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com> --- arch/arm64/configs/defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig index 0777bcae9104..cb24a3d1219b 100644 --- a/arch/arm64/configs/defconfig +++ b/arch/arm64/configs/defconfig @@ -816,6 +816,7 @@ CONFIG_DRM_PANEL_EDP=m CONFIG_DRM_PANEL_MANTIX_MLAF057WE51=m CONFIG_DRM_PANEL_RAYDIUM_RM67191=m CONFIG_DRM_PANEL_SITRONIX_ST7703=m +CONFIG_DRM_PANEL_STARTEK_KD070FHFID015=m CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA=m CONFIG_DRM_PANEL_VISIONOX_VTDR6130=m CONFIG_DRM_LONTIUM_LT8912B=m -- 2.25.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2023-07-12 8:28 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-07-11 15:36 [PATCH 0/3] Add startek-kd070fhfid015 display support Alexandre Mergnat 2023-07-11 15:36 ` [PATCH 1/3] dt-bindings: display: panel: add startek kd070fhfid015 support Alexandre Mergnat 2023-07-11 18:24 ` Conor Dooley 2023-07-12 5:32 ` Krzysztof Kozlowski 2023-07-12 8:01 ` Alexandre Mergnat 2023-07-12 8:23 ` Krzysztof Kozlowski 2023-07-11 15:36 ` [PATCH 2/3] drm/panel: Support for startek-kd070fhfid015 MIPI-DSI panel amergnat 2023-07-11 15:36 ` [PATCH 3/3] arm64: defconfig: enable STARTEK KD070FHFID015 panel Alexandre Mergnat
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).