Re: [PATCH v4 06/10] drm/panel: Add Synaptics R63353 panel driver
Hi Dario, kernel test robot noticed the following build warnings: https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Dario-Binacchi/drm-bridge-Fix-bridge-disable-logic/20231205-185455 base: git://anongit.freedesktop.org/drm/drm-misc drm-misc-next patch link: https://lore.kernel.org/r/20231205105341.4100896-7-dario.binacchi%40amarulasolutions.com patch subject: [PATCH v4 06/10] drm/panel: Add Synaptics R63353 panel driver config: i386-randconfig-r071-20231206 (https://download.01.org/0day-ci/archive/20231207/202312070214.eyi9t4eq-...@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce: (https://download.01.org/0day-ci/archive/20231207/202312070214.eyi9t4eq-...@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot | Reported-by: Dan Carpenter | Closes: https://lore.kernel.org/r/202312070214.eyi9t4eq-...@intel.com/ smatch warnings: drivers/gpu/drm/panel/panel-synaptics-r63353.c:132 r63353_panel_activate() warn: missing unwind goto? vim +132 drivers/gpu/drm/panel/panel-synaptics-r63353.c 64f91a53613aea Michael Trimarchi 2023-12-05 107 static int r63353_panel_activate(struct r63353_panel *rpanel) 64f91a53613aea Michael Trimarchi 2023-12-05 108 { 64f91a53613aea Michael Trimarchi 2023-12-05 109struct mipi_dsi_device *dsi = rpanel->dsi; 64f91a53613aea Michael Trimarchi 2023-12-05 110struct device *dev = &dsi->dev; 64f91a53613aea Michael Trimarchi 2023-12-05 111int i, ret; 64f91a53613aea Michael Trimarchi 2023-12-05 112 64f91a53613aea Michael Trimarchi 2023-12-05 113ret = mipi_dsi_dcs_soft_reset(dsi); 64f91a53613aea Michael Trimarchi 2023-12-05 114if (ret < 0) { 64f91a53613aea Michael Trimarchi 2023-12-05 115dev_err(dev, "Failed to do Software Reset (%d)\n", ret); 64f91a53613aea Michael Trimarchi 2023-12-05 116goto fail; 64f91a53613aea Michael Trimarchi 2023-12-05 117} 64f91a53613aea Michael Trimarchi 2023-12-05 118 64f91a53613aea Michael Trimarchi 2023-12-05 119usleep_range(15000, 17000); 64f91a53613aea Michael Trimarchi 2023-12-05 120 64f91a53613aea Michael Trimarchi 2023-12-05 121ret = mipi_dsi_dcs_enter_sleep_mode(dsi); 64f91a53613aea Michael Trimarchi 2023-12-05 122if (ret < 0) { 64f91a53613aea Michael Trimarchi 2023-12-05 123dev_err(dev, "Failed to enter sleep mode (%d)\n", ret); 64f91a53613aea Michael Trimarchi 2023-12-05 124goto fail; 64f91a53613aea Michael Trimarchi 2023-12-05 125} 64f91a53613aea Michael Trimarchi 2023-12-05 126 64f91a53613aea Michael Trimarchi 2023-12-05 127for (i = 0; i < rpanel->pdata->init_length; i++) { 64f91a53613aea Michael Trimarchi 2023-12-05 128const struct r63353_instr *instr = &rpanel->pdata->init[i]; 64f91a53613aea Michael Trimarchi 2023-12-05 129 64f91a53613aea Michael Trimarchi 2023-12-05 130ret = mipi_dsi_dcs_write_buffer(dsi, instr->data, instr->len); 64f91a53613aea Michael Trimarchi 2023-12-05 131if (ret < 0) 64f91a53613aea Michael Trimarchi 2023-12-05 @132return ret; goto fail? 64f91a53613aea Michael Trimarchi 2023-12-05 133} 64f91a53613aea Michael Trimarchi 2023-12-05 134 64f91a53613aea Michael Trimarchi 2023-12-05 135msleep(120); 64f91a53613aea Michael Trimarchi 2023-12-05 136 64f91a53613aea Michael Trimarchi 2023-12-05 137ret = mipi_dsi_dcs_exit_sleep_mode(dsi); 64f91a53613aea Michael Trimarchi 2023-12-05 138if (ret < 0) { 64f91a53613aea Michael Trimarchi 2023-12-05 139dev_err(dev, "Failed to exit sleep mode (%d)\n", ret); 64f91a53613aea Michael Trimarchi 2023-12-05 140goto fail; 64f91a53613aea Michael Trimarchi 2023-12-05 141} 64f91a53613aea Michael Trimarchi 2023-12-05 142 64f91a53613aea Michael Trimarchi 2023-12-05 143usleep_range(5000, 1); 64f91a53613aea Michael Trimarchi 2023-12-05 144 64f91a53613aea Michael Trimarchi 2023-12-05 145ret = mipi_dsi_dcs_set_display_on(dsi); 64f91a53613aea Michael Trimarchi 2023-12-05 146if (ret < 0) { 64f91a53613aea Michael Trimarchi 2023-12-05 147dev_err(dev, "Failed to set display ON (%d)\n", ret); 64f91a53613aea Michael Trimarchi 2023-12-05 148goto fail; 64f91a53613aea Michael Trimarchi 2023-12-05 149} 64f91a53613aea Michael Trimarchi 2023-12-05 150 64f91a53613aea Michael Trimarchi 2023-12-05 151return 0; 64f91a53613aea Michael Trimarchi 2023-12-05 152 64f91a53613aea Michael Trimarchi 2023-12-05 153 fail: 64f91a53613aea Michael Trimarchi 2023-12-05 15
[PATCH v4 06/10] drm/panel: Add Synaptics R63353 panel driver
From: Michael Trimarchi The LS068B3SX02 panel is based on the Synaptics R63353 Controller. Add a driver for it. Signed-off-by: Michael Trimarchi Signed-off-by: Dario Binacchi --- Changes in v4: - Set the reset gpio to low in a single operation - Remove duplicated code for prepare/unprepare callbacks Changes in v2: - Adjust the timings of the panel reset MAINTAINERS | 6 + drivers/gpu/drm/panel/Kconfig | 9 + drivers/gpu/drm/panel/Makefile| 1 + .../gpu/drm/panel/panel-synaptics-r63353.c| 363 ++ 4 files changed, 379 insertions(+) create mode 100644 drivers/gpu/drm/panel/panel-synaptics-r63353.c diff --git a/MAINTAINERS b/MAINTAINERS index 788be9ab5b73..b82dc141d209 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -6874,6 +6874,12 @@ T: git git://anongit.freedesktop.org/drm/drm-misc F: Documentation/devicetree/bindings/display/ste,mcde.yaml F: drivers/gpu/drm/mcde/ +DRM DRIVER FOR SYNAPTICS R63353 PANELS +M: Michael Trimarchi +S: Maintained +F: Documentation/devicetree/bindings/display/panel/synaptics,r63353.yaml +F: drivers/gpu/drm/panel/panel-synaptics-r63353.c + DRM DRIVER FOR TI DLPC3433 MIPI DSI TO DMD BRIDGE M: Jagan Teki S: Maintained diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig index 99e14dc212ec..d018702be3dc 100644 --- a/drivers/gpu/drm/panel/Kconfig +++ b/drivers/gpu/drm/panel/Kconfig @@ -735,6 +735,15 @@ config DRM_PANEL_SITRONIX_ST7789V Say Y here if you want to enable support for the Sitronix ST7789V controller for 240x320 LCD panels +config DRM_PANEL_SYNAPTICS_R63353 + tristate "Synaptics R63353-based panels" + depends on OF + depends on DRM_MIPI_DSI + depends on BACKLIGHT_CLASS_DEVICE + help + Say Y if you want to enable support for panels based on the + Synaptics R63353 controller. + config DRM_PANEL_SONY_ACX565AKM tristate "Sony ACX565AKM panel" depends on GPIOLIB && OF && SPI diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile index d10c3de51c6d..f267d932c2b5 100644 --- a/drivers/gpu/drm/panel/Makefile +++ b/drivers/gpu/drm/panel/Makefile @@ -74,6 +74,7 @@ obj-$(CONFIG_DRM_PANEL_SHARP_LS060T1SX01) += panel-sharp-ls060t1sx01.o obj-$(CONFIG_DRM_PANEL_SITRONIX_ST7701) += panel-sitronix-st7701.o obj-$(CONFIG_DRM_PANEL_SITRONIX_ST7703) += panel-sitronix-st7703.o obj-$(CONFIG_DRM_PANEL_SITRONIX_ST7789V) += panel-sitronix-st7789v.o +obj-$(CONFIG_DRM_PANEL_SYNAPTICS_R63353) += panel-synaptics-r63353.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 diff --git a/drivers/gpu/drm/panel/panel-synaptics-r63353.c b/drivers/gpu/drm/panel/panel-synaptics-r63353.c new file mode 100644 index ..0a3c2a3d5998 --- /dev/null +++ b/drivers/gpu/drm/panel/panel-synaptics-r63353.c @@ -0,0 +1,363 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Synaptics R63353 Controller driver + * + * Copyright (C) 2020 BSH Hausgerate GmbH + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include + +#define R63353_INSTR(...) { \ + .len = sizeof((u8[]) {__VA_ARGS__}), \ + .data = (u8[]){__VA_ARGS__} \ + } + +struct r63353_instr { + size_t len; + const u8 *data; +}; + +static const struct r63353_instr sharp_ls068b3sx02_init[] = { + R63353_INSTR(0x51, 0xff), + R63353_INSTR(0x53, 0x0c), + R63353_INSTR(0x55, 0x00), + R63353_INSTR(0x84, 0x00), + R63353_INSTR(0x29), +}; + +struct r63353_desc { + const char *name; + const struct r63353_instr *init; + const size_t init_length; + const struct drm_display_mode *mode; + u32 width_mm; + u32 height_mm; +}; + +struct r63353_panel { + struct drm_panel base; + struct mipi_dsi_device *dsi; + + struct gpio_desc *reset_gpio; + struct regulator *dvdd; + struct regulator *avdd; + + struct r63353_desc *pdata; +}; + +static inline struct r63353_panel *to_r63353_panel(struct drm_panel *panel) +{ + return container_of(panel, struct r63353_panel, base); +} + +static int r63353_panel_power_on(struct r63353_panel *rpanel) +{ + struct mipi_dsi_device *dsi = rpanel->dsi; + struct device *dev = &dsi->dev; + int ret; + + ret = regulator_enable(rpanel->avdd); + if (ret) { + dev_err(dev, "Failed to enable avdd regulator (%d)\n", ret); + return ret; + } + + usleep_range(15000, 25000); + + ret = regulator_enable(rpanel->dvdd); + if (ret) { + dev_err(dev, "Failed to enable dvdd regulator