dt-bindings: Add Japan Display Inc vendor id
Subsystems (4)
PATCH 1/3 dt-bindings: Add Japan Display Inc vendor id
Add vendor id for Japan Display Inc.
--- Documentation/devicetree/bindings/vendor-prefixes.txt | 1 + 1 file changed, 1 insertion(+)
Documentation/devicetree/bindings/vendor-prefixes.txt +1 -0
@@ -139,6 +139,7 @@ invensense InvenSense Inc. isee ISEE 2007 S.L. isil Intersil issi Integrated Silicon Solutions Inc. +jdi Japan Display Inc. jedec JEDEC Solid State Technology Association karo Ka-Ro electronics GmbH keymile Keymile GmbH
Signature · 1 line
2.1.2
PATCH v3 2/3 dt-bindings: Add jdi lt070me05000 panel bindings
Add documentation for lt070me05000 panel
---
v2:
* incorporated rob herring and thierry reviews gpio to gpios, gpio to regulator using fixed regulators and pwm backlight is removed, since it is controlled by dcs commands
v3:
* incorporated thierry reviews
- Added gpio polarity details for reset-gpios
- proper naming conventions and sequence wrt panel datasheet (vddp-supply, iovcc-supply,
enable-gpios, reset-gpios, dcdc-en-gpios)
--- .../bindings/display/panel/jdi,lt070me05000.txt | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt new file +33 -0
@@ -0,0 +1,33 @@ +JDI model LT070ME05000 1200x1920 7" DSI Panel + +Required properties: +- compatible: should be "jdi,lt070me05000" +- vddp-supply: phandle of the regulator that provides the supply voltage + Power IC supply (3-5V) +- iovcc-supply: phandle of the regulator that provides the supply voltage + IOVCC , power supply for LCM (1.8V) +- enable-gpios: phandle of gpio for enable line + LED_EN, LED backlight enable, High active +- reset-gpios: phandle of gpio for reset line + This should be 8mA, gpio can be configured using mux, pinctrl, pinctrl-names + XRES, Reset, Low active +- dcdc-en-gpios: phandle of the gpio for power ic line + Power IC supply enable, High active + +Example: + + dsi0: qcom,mdss_dsi@4700000 { + panel@0 { + compatible = "jdi,lt070me05000"; + reg = <0>; + pinctrl-names = "default"; + pinctrl-0 = <&dsi_panel_pinctrl>; + + vddp-supply = <&pm8921_l17>; + iovcc-supply = <&pm8921_lvs7>; + + enable-gpios = <&pm8921_gpio 36 GPIO_ACTIVE_HIGH>; + reset-gpios = <&tlmm_pinmux 54 GPIO_ACTIVE_LOW>; + dcdc-en-gpios = <&pm8921_gpio 23 GPIO_ACTIVE_HIGH>; + }; + };
Signature · 6 lines
2.1.2 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v3 2/3] dt-bindings: Add jdi lt070me05000 panel bindings
thierry,
please review.
Quoted 69 lines · Vinay Simha BN
Add documentation for lt070me05000 panel
Cc Archit Taneja <[email protected]>Cc John Stultz <[email protected]>Cc Thierry Reding <[email protected]>Cc Sumit Semwal <[email protected]>Signed-off-by Vinay Simha BN <[email protected]>Acked-by Rob Herring <[email protected]>---
v2:
* incorporated rob herring and thierry reviews gpio to gpios, gpio to regulator using fixed regulators and pwm backlight is removed, since it is controlled by dcs commandsv3:
* incorporated thierry reviews
- Added gpio polarity details for reset-gpios
- proper naming conventions and sequence wrt panel datasheet (vddp-supply, iovcc-supply,
enable-gpios, reset-gpios, dcdc-en-gpios)--- .../bindings/display/panel/jdi,lt070me05000.txt | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txtDocumentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt new file +33
-1@@ -0,0 +1,33 @@ +JDI model LT070ME05000 1200x1920 7" DSI Panel + +Required properties: +- compatible: should be "jdi,lt070me05000" +- vddp-supply: phandle of the regulator that provides the supply voltage + Power IC supply (3-5V) +- iovcc-supply: phandle of the regulator that provides the supply voltage + IOVCC , power supply for LCM (1.8V) +- enable-gpios: phandle of gpio for enable line + LED_EN, LED backlight enable, High active +- reset-gpios: phandle of gpio for reset line + This should be 8mA, gpio can be configured using mux, pinctrl, pinctrl-names + XRES, Reset, Low active +- dcdc-en-gpios: phandle of the gpio for power ic line + Power IC supply enable, High active + +Example: + + dsi0: qcom,mdss_dsi@4700000 { + panel@0 { + compatible = "jdi,lt070me05000"; + reg = <0>; + pinctrl-names = "default"; + pinctrl-0 = <&dsi_panel_pinctrl>; + + vddp-supply = <&pm8921_l17>; + iovcc-supply = <&pm8921_lvs7>; + + enable-gpios = <&pm8921_gpio 36 GPIO_ACTIVE_HIGH>; + reset-gpios = <&tlmm_pinmux 54 GPIO_ACTIVE_LOW>; + dcdc-en-gpios = <&pm8921_gpio 23 GPIO_ACTIVE_HIGH>; + }; + }; --2.1.2
Signature · 2 lines
regards, vinaysimha
PATCH v10 3/3 drm/panel: Add JDI LT070ME05000 WUXGA DSI Panel
In reply to Vinay Simha BNAdd support for the JDI LT070ME05000 WUXGA DSI panel used in Nexus 7 2013 devices.
Programming sequence for the panel is was originally found in the android-msm-flo-3.4-lollipop-release branch from:
https://android.googlesource.com/kernel/msm.git
And video mode setting is from dsi-panel-jdi-dualmipi1-video.dtsi file in:
git://codeaurora.org/kernel/msm-3.10.git LNX.LA.3.6_rb1.27
---
v1:
* sumit ported to drm/panel framework, john cherry-picked to mainline, folded down other fixes from Vinay and Archit, vinay removed interface setting cmd mode, video mode panel selected
v2:
* incorporated code reviews from theiry, archit
code style, alphabetical soring in Makefile, Kconfig, regulator_bulk, arrays of u8, generic helper function, documentation bindings,
v3:
* dcs backlight support added
* tested this panel driver in nexus7 2013 device
v4:
* backlight interface added in the panel driver
* incorporated width_mm and height_mm suggested by rob herring
v5:
* theirry review comments incorporated
panel model naming consistent, alphabetical soring in Kconfig Makefile, MAX_BRIGHTNESS dropped, regulator_names, parameterize panel width and height, descprition for control display, cabc and interface setting, temporary variable removed, consistent error reporting and commit message
* removed tear on/off, scanline, since these are required only for command mode panels
v6:
* emil review comments incorporated PANEL_NUM_REGULATORS dropped, return ret added at necessary places, if checks dropped for backlight and gpios
v7:
* emil review comments incorporated
added ARRAY_SIZE in struct, regulator_bulk_disable in poweroff, gpios checks dropped.
some returns cannot be dropped, since drm panel framework return type required.
v8:
* emil review commnets incorporated for jdi_panel_unprepare, dropped the returns (ref: panel-sharp-lq101r1sx01.c) and for jdi_panel_prepare(panel_on) it does not return prematurely and goes to poweroff if not success
* few dev_err's for panel_init
v9:
* function drm_panel_create_dsi_backlight made as static
v10:
* proper naming conventions and sequence wrt panel datasheet (vddp-supply, iovcc-supply,
enable-gpios, reset-gpios, dcdc-en-gpios)
* GPIO_ACTIVE_LOW polarity logic for reset-gpios
--- drivers/gpu/drm/panel/Kconfig | 11 + drivers/gpu/drm/panel/Makefile | 1 + drivers/gpu/drm/panel/panel-jdi-lt070me05000.c | 532 +++++++++++++++++++++++++ 3 files changed, 544 insertions(+) create mode 100644 drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
drivers/gpu/drm/panel/Kconfig +11 -0
@@ -18,6 +18,17 @@ config DRM_PANEL_SIMPLE that it can be automatically turned off when the panel goes into a low power state. +config DRM_PANEL_JDI_LT070ME05000 + tristate "JDI LT070ME05000 WUXGA DSI 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 JDI DSI video mode + panel as found in Google Nexus 7 (2013) devices. + The panel has a 1200(RGB)×1920 (WUXGA) resolution and uses + 24 bit per pixel. + config DRM_PANEL_SAMSUNG_LD9040 tristate "Samsung LD9040 RGB/SPI panel" depends on OF && SPI
drivers/gpu/drm/panel/Makefile +1 -0
@@ -1,4 +1,5 @@ obj-$(CONFIG_DRM_PANEL_SIMPLE) += panel-simple.o +obj-$(CONFIG_DRM_PANEL_JDI_LT070ME05000) += panel-jdi-lt070me05000.o obj-$(CONFIG_DRM_PANEL_LG_LG4573) += panel-lg-lg4573.o obj-$(CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00) += panel-panasonic-vvx10f034n00.o obj-$(CONFIG_DRM_PANEL_SAMSUNG_LD9040) += panel-samsung-ld9040.o
drivers/gpu/drm/panel/panel-jdi-lt070me05000.c new file +532 -0
532 lines not on this page · raw message
Signature · 1 line
2.1.2
Re: [PATCH v10 3/3] drm/panel: Add JDI LT070ME05000 WUXGA DSI Panel
thierry,
please review.
Quoted 660 lines · Vinay Simha BN
Add support for the JDI LT070ME05000 WUXGA DSI panel used in Nexus 7 2013 devices.
Programming sequence for the panel is was originally found in the android-msm-flo-3.4-lollipop-release branch from:
https://android.googlesource.com/kernel/msm.gitAnd video mode setting is from
dsi-panel-jdi-dualmipi1-video.dtsifile in:git://codeaurora.org/kernel/msm-3.10.git LNX.LA.3.6_rb1.27Cc Archit Taneja <[email protected]>Cc Rob Clark <[email protected]>Cc Sumit Semwal <[email protected]>Cc John Stultz <[email protected]>Cc Emil Velikov <[email protected]>Cc Thierry Reding <[email protected]>Cc David Airlie <[email protected]>Signed-off-by Sumit Semwal <[email protected]>Signed-off-by John Stultz <[email protected]>Signed-off-by Vinay Simha BN <[email protected]>Tested-by John Stultz <[email protected]>Reviewed-by Emil Velikov <[email protected]>---
v1:
* sumit ported to drm/panel framework, john cherry-picked to mainline, folded down other fixes from Vinay and Archit, vinay removed interface setting cmd mode, video mode panel selectedv2:
* incorporated code reviews from theiry, archit
code style, alphabetical soring inMakefile,Kconfig,regulator_bulk, arrays of u8, generic helper function, documentation bindings,v3:
* dcs backlight support added
* tested this panel driver in nexus7 2013 devicev4:
* backlight interface added in the panel driver
* incorporatedwidth_mmandheight_mmsuggested by rob herringv5:
* theirry review comments incorporated
panel model naming consistent, alphabetical soring inKconfigMakefile,MAX_BRIGHTNESSdropped,regulator_names, parameterize panel width and height, descprition for control display, cabc and interface setting, temporary variable removed, consistent error reporting and commit message
* removed tear on/off, scanline, since these are required only for command mode panelsv6:
* emil review comments incorporatedPANEL_NUM_REGULATORSdropped, return ret added at necessary places, if checks dropped for backlight and gpiosv7:
* emil review comments incorporated
addedARRAY_SIZEin struct,regulator_bulk_disablein poweroff, gpios checks dropped.
some returns cannot be dropped, since drm panel framework return type required.v8:
* emil review commnets incorporated forjdi_panel_unprepare, dropped the returns (ref:panel-sharp-lq101r1sx01.c) and forjdi_panel_prepare(panel_on)it does not return prematurely and goes to poweroff if not success
* few dev_err's forpanel_initv9:
* functiondrm_panel_create_dsi_backlightmade as staticv10:
* proper naming conventions and sequence wrt panel datasheet (vddp-supply, iovcc-supply,
enable-gpios, reset-gpios, dcdc-en-gpios)
*GPIO_ACTIVE_LOWpolarity logic for reset-gpios--- drivers/gpu/drm/panel/Kconfig | 11 + drivers/gpu/drm/panel/Makefile | 1 + drivers/gpu/drm/panel/panel-jdi-lt070me05000.c | 532 +++++++++++++++++++++++++ 3 files changed, 544 insertions(+) create mode 100644 drivers/gpu/drm/panel/panel-jdi-lt070me05000.cdrivers/gpu/drm/panel/Kconfig +11
-0@@ -18,6 +18,17 @@ config DRM_PANEL_SIMPLE that it can be automatically turned off when the panel goes into a low power state. +config DRM_PANEL_JDI_LT070ME05000 + tristate "JDI LT070ME05000 WUXGA DSI 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 JDI DSI video mode + panel as found in Google Nexus 7 (2013) devices. + The panel has a 1200(RGB)×1920 (WUXGA) resolution and uses + 24 bit per pixel. + config DRM_PANEL_SAMSUNG_LD9040 tristate "Samsung LD9040 RGB/SPI panel" depends on OF && SPIdrivers/gpu/drm/panel/Makefile +1
-0@@ -1,4 +1,5 @@ obj-$(CONFIG_DRM_PANEL_SIMPLE) += panel-simple.o +obj-$(CONFIG_DRM_PANEL_JDI_LT070ME05000) += panel-jdi-lt070me05000.o obj-$(CONFIG_DRM_PANEL_LG_LG4573) += panel-lg-lg4573.o obj-$(CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00) += panel-panasonic-vvx10f034n00.o obj-$(CONFIG_DRM_PANEL_SAMSUNG_LD9040) += panel-samsung-ld9040.odrivers/gpu/drm/panel/panel-jdi-lt070me05000.c new file +532
-1@@ -0,0 +1,532 @@ +/* +* Copyright (C) 2016 InforceComputing +* Author: Vinay Simha BN <[email protected]> +* +* Copyright (C) 2016 Linaro Ltd +* Author: Sumit Semwal <[email protected]> +* +* From internet archives, the panel for Nexus 7 2nd Gen, 2013 model is a +* JDI model LT070ME05000, and its data sheet is at: +* http://panelone.net/en/7-0-inch/JDI_LT070ME05000_7.0_inch-datasheet +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2 as published by +* the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along with +* this program. If not, see <http://www.gnu.org/licenses/>. +*/ +#include <linux/backlight.h> +#include <linux/gpio/consumer.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/regulator/consumer.h> + +#include <drm/drmP.h> +#include <drm/drm_crtc.h> +#include <drm/drm_mipi_dsi.h> +#include <drm/drm_panel.h> + +#include <video/mipi_display.h> + +static const char *const regulator_names[] = { +"vddp" , +"iovcc" +}; + +struct jdi_panel { +struct drm_panel base; +struct mipi_dsi_device *dsi; + +struct regulator_bulk_data supplies[ARRAY_SIZE (regulator_names)]; + +struct gpio_desc *enable_gpio; +struct gpio_desc *reset_gpio; +struct gpio_desc *dcdc_en_gpio; +struct backlight_device *backlight; + +bool prepared; +bool enabled; + +const struct drm_display_mode *mode; +}; + +static inline struct jdi_panel *to_jdi_panel (struct drm_panel *panel) +{ + return container_of(panel, struct jdi_panel, base); +} + +static int jdi_panel_init (struct jdi_panel *jdi) +{ +struct mipi_dsi_device *dsi = jdi->dsi; +struct device *dev = &jdi->dsi->dev; +int ret; + + dsi->mode_flags |=MIPI_DSI_MODE_LPM ; + + ret =mipi_dsi_dcs_soft_reset (dsi); +if (ret <0 ) +return ret; + +usleep_range (10000 ,20000 ); + + ret =mipi_dsi_dcs_set_pixel_format (dsi,MIPI_DCS_PIXEL_FMT_24BIT <<4 ); +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 , jdi->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 , jdi->mode->vdisplay -1 ); +if (ret <0 ) { +dev_err (dev,"failed to set page address: %d\n" , ret); +return ret; + } + +/* +* BIT(5) BCTRL = 1 Backlight Control Block On, Brightness registers +* are active +* BIT(3) BL = 1 Backlight Control On +* BIT(2) DD = 0 Display Dimming is Off +*/ + ret =mipi_dsi_dcs_write (dsi,MIPI_DCS_WRITE_CONTROL_DISPLAY , + (u8 []){0x24 },1 ); +if (ret <0 ) { +dev_err (dev,"failed to write control display: %d\n" , ret); +return ret; + } + +/* CABC off */ + ret =mipi_dsi_dcs_write (dsi,MIPI_DCS_WRITE_POWER_SAVE , + (u8 []){0x00 },1 ); +if (ret <0 ) { +dev_err (dev,"failed to set cabc off: %d\n" , ret); +return ret; + } + + 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 ); + + ret =mipi_dsi_generic_write (dsi, (u8 []){0xB0 ,0x00 },2 ); +if (ret <0 ) { +dev_err (dev,"failed to set mcap: %d\n" , ret); +return ret; + } + +mdelay (10 ); + +/* Interface setting, video mode */ + ret =mipi_dsi_generic_write (dsi, (u8 []) + {0xB3 ,0x26 ,0x08 ,0x00 ,0x20 ,0x00 },6 ); +if (ret <0 ) { +dev_err (dev,"failed to set display interface setting: %d\n" + , ret); +return ret; + } + +mdelay (20 ); + + ret =mipi_dsi_generic_write (dsi, (u8 []){0xB0 ,0x03 },2 ); +if (ret <0 ) { +dev_err (dev,"failed to set default values for mcap: %d\n" + , ret); +return ret; + } + +return 0 ; +} + +static int jdi_panel_on (struct jdi_panel *jdi) +{ +struct mipi_dsi_device *dsi = jdi->dsi; +struct device *dev = &jdi->dsi->dev; +int ret; + + dsi->mode_flags |=MIPI_DSI_MODE_LPM ; + + ret =mipi_dsi_dcs_set_display_on (dsi); +if (ret <0 ) +dev_err (dev,"failed to set display on: %d\n" , ret); + +return ret; +} + +static void jdi_panel_off (struct jdi_panel *jdi) +{ +struct mipi_dsi_device *dsi = jdi->dsi; +struct device *dev = &jdi->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 jdi_panel_disable (struct drm_panel *panel) +{ +struct jdi_panel *jdi =to_jdi_panel (panel); + +if (!jdi->enabled) +return 0 ; + + jdi->backlight->props.power =FB_BLANK_POWERDOWN ; +backlight_update_status (jdi->backlight); + + jdi->enabled = false; + +return 0 ; +} + +static int jdi_panel_unprepare (struct drm_panel *panel) +{ +struct jdi_panel *jdi =to_jdi_panel (panel); +struct device *dev = &jdi->dsi->dev; +int ret; + +if (!jdi->prepared) +return 0 ; + +jdi_panel_off (jdi); + + ret =regulator_bulk_disable (ARRAY_SIZE (jdi->supplies), jdi->supplies); +if (ret <0 ) +dev_err (dev,"regulator disable failed, %d\n" , ret); + +gpiod_set_value (jdi->enable_gpio,0 ); + +gpiod_set_value (jdi->reset_gpio,1 ); + +gpiod_set_value (jdi->dcdc_en_gpio,0 ); + + jdi->prepared = false; + +return 0 ; +} + +static int jdi_panel_prepare (struct drm_panel *panel) +{ +struct jdi_panel *jdi =to_jdi_panel (panel); +struct device *dev = &jdi->dsi->dev; +int ret; + +if (jdi->prepared) +return 0 ; + + ret =regulator_bulk_enable (ARRAY_SIZE (jdi->supplies), jdi->supplies); +if (ret <0 ) { +dev_err (dev,"regulator enable failed, %d\n" , ret); +return ret; + } + +msleep (20 ); + +gpiod_set_value (jdi->dcdc_en_gpio,1 ); +usleep_range (10 ,20 ); + +gpiod_set_value (jdi->reset_gpio,0 ); +usleep_range (10 ,20 ); + +gpiod_set_value (jdi->enable_gpio,1 ); +usleep_range (10 ,20 ); + + ret =jdi_panel_init (jdi); +if (ret <0 ) { +dev_err (dev,"failed to init panel: %d\n" , ret); + goto poweroff; + } + + ret =jdi_panel_on (jdi); +if (ret <0 ) { +dev_err (dev,"failed to set panel on: %d\n" , ret); + goto poweroff; + } + + jdi->prepared = true; + +return 0 ; + +poweroff: + ret =regulator_bulk_disable (ARRAY_SIZE (jdi->supplies), jdi->supplies); +if (ret <0 ) +dev_err (dev,"regulator disable failed, %d\n" , ret); + +gpiod_set_value (jdi->enable_gpio,0 ); + +gpiod_set_value (jdi->reset_gpio,1 ); + +gpiod_set_value (jdi->dcdc_en_gpio,0 ); + +return ret; +} + +static int jdi_panel_enable (struct drm_panel *panel) +{ +struct jdi_panel *jdi =to_jdi_panel (panel); + +if (jdi->enabled) +return 0 ; + + jdi->backlight->props.power =FB_BLANK_UNBLANK ; +backlight_update_status (jdi->backlight); + + jdi->enabled = true; + +return 0 ; +} + +static const struct drm_display_mode default_mode = { + .clock =155493 , + .hdisplay =1200 , + .hsync_start =1200 +48 , + .hsync_end =1200 +48 +32 , + .htotal =1200 +48 +32 +60 , + .vdisplay =1920 , + .vsync_start =1920 +3 , + .vsync_end =1920 +3 +5 , + .vtotal =1920 +3 +5 +6 , + .vrefresh =60 , + .flags =0 , +}; + +static int jdi_panel_get_modes (struct drm_panel *panel) +{ +struct drm_display_mode *mode; +struct jdi_panel *jdi =to_jdi_panel (panel); +struct device *dev = &jdi->dsi->dev; + + mode =drm_mode_duplicate (panel->drm, &default_mode); +if (!mode) { +dev_err (dev,"failed to add mode %ux%ux@%u\n" , + default_mode.hdisplay, default_mode.vdisplay, + default_mode.vrefresh); +return -ENOMEM ; + } + +drm_mode_set_name (mode); + +drm_mode_probed_add (panel->connector, mode); + + panel->connector->display_info.width_mm =95 ; + panel->connector->display_info.height_mm =151 ; + +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); +int ret; + + dsi->mode_flags &= ~MIPI_DSI_MODE_LPM ; + + ret =mipi_dsi_dcs_set_display_brightness (dsi, bl->props.brightness); +if (ret <0 ) +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; + +memset (&props,0 ,sizeof (props)); + props.type =BACKLIGHT_RAW ; + props.brightness =255 ; + props.max_brightness =255 ; + +return devm_backlight_device_register (dev,dev_name (dev), dev, dsi, + &dsi_bl_ops, &props); +} + +static const struct drm_panel_funcs jdi_panel_funcs = { + .disable = jdi_panel_disable, + .unprepare = jdi_panel_unprepare, + .prepare = jdi_panel_prepare, + .enable = jdi_panel_enable, + .get_modes = jdi_panel_get_modes, +}; + +static const struct of_device_id jdi_of_match[] = { + { .compatible ="jdi,lt070me05000" , }, + { } +}; +MODULE_DEVICE_TABLE (of, jdi_of_match); + +static int jdi_panel_add (struct jdi_panel *jdi) +{ +struct device *dev = &jdi->dsi->dev; +int ret; +unsigned int i; + + jdi->mode = &default_mode; + +for (i =0 ; i <ARRAY_SIZE (jdi->supplies); i++) + jdi->supplies[i].supply = regulator_names[i]; + + ret =devm_regulator_bulk_get (dev,ARRAY_SIZE (jdi->supplies), + jdi->supplies); +if (ret <0 ) { +dev_err (dev,"failed to init regulator, ret=%d\n" , ret); +return ret; + } + + jdi->enable_gpio =devm_gpiod_get (dev,"enable" ,GPIOD_OUT_LOW ); +if (IS_ERR (jdi->enable_gpio)) { + ret =PTR_ERR (jdi->enable_gpio); +dev_err (dev,"cannot get enable-gpio %d\n" , ret); +return ret; + } + + jdi->reset_gpio =devm_gpiod_get (dev,"reset" ,GPIOD_OUT_HIGH ); +if (IS_ERR (jdi->reset_gpio)) { + ret =PTR_ERR (jdi->reset_gpio); +dev_err (dev,"cannot get reset-gpios %d\n" , ret); +return ret; + } + + jdi->dcdc_en_gpio =devm_gpiod_get (dev,"dcdc-en" ,GPIOD_OUT_LOW ); +if (IS_ERR (jdi->dcdc_en_gpio)) { + ret =PTR_ERR (jdi->dcdc_en_gpio); +dev_err (dev,"cannot get dcdc-en-gpio %d\n" , ret); +return ret; + } + + jdi->backlight =drm_panel_create_dsi_backlight (jdi->dsi); +if (IS_ERR (jdi->backlight)) { + ret =PTR_ERR (jdi->backlight); +dev_err (dev,"failed to register backlight %d\n" , ret); +return ret; + } + +drm_panel_init (&jdi->base); + jdi->base.funcs = &jdi_panel_funcs; + jdi->base.dev = &jdi->dsi->dev; + + ret =drm_panel_add (&jdi->base); + +return ret; +} + +static void jdi_panel_del (struct jdi_panel *jdi) +{ +if (jdi->base.dev) +drm_panel_remove (&jdi->base); +} + +static int jdi_panel_probe (struct mipi_dsi_device *dsi) +{ +struct jdi_panel *jdi; +int ret; + + dsi->lanes =4 ; + dsi->format =MIPI_DSI_FMT_RGB888 ; + dsi->mode_flags =MIPI_DSI_MODE_VIDEO_HSE |MIPI_DSI_MODE_VIDEO | +MIPI_DSI_CLOCK_NON_CONTINUOUS ; + + jdi =devm_kzalloc (&dsi->dev,sizeof (*jdi),GFP_KERNEL ); +if (!jdi) +return -ENOMEM ; + +mipi_dsi_set_drvdata (dsi, jdi); + + jdi->dsi = dsi; + + ret =jdi_panel_add (jdi); +if (ret <0 ) +return ret; + +return mipi_dsi_attach (dsi); +} + +static int jdi_panel_remove (struct mipi_dsi_device *dsi) +{ +struct jdi_panel *jdi =mipi_dsi_get_drvdata (dsi); +int ret; + + ret =jdi_panel_disable (&jdi->base); +if (ret <0 ) +dev_err (&dsi->dev,"failed to disable panel: %d\n" , ret); + + ret =mipi_dsi_detach (dsi); +if (ret <0 ) +dev_err (&dsi->dev,"failed to detach from DSI host: %d\n" , + ret); + +drm_panel_detach (&jdi->base); +jdi_panel_del (jdi); + +return 0 ; +} + +static void jdi_panel_shutdown (struct mipi_dsi_device *dsi) +{ +struct jdi_panel *jdi =mipi_dsi_get_drvdata (dsi); + +jdi_panel_disable (&jdi->base); +} + +static struct mipi_dsi_driver jdi_panel_driver = { + .driver = { + .name ="panel-jdi-lt070me05000" , + .of_match_table = jdi_of_match, + }, + .probe = jdi_panel_probe, + .remove = jdi_panel_remove, + .shutdown = jdi_panel_shutdown, +}; +module_mipi_dsi_driver (jdi_panel_driver); + +MODULE_AUTHOR ("Sumit Semwal <[email protected]>" ); +MODULE_AUTHOR ("Vinay Simha BN <[email protected]>" ); +MODULE_DESCRIPTION ("JDI LT070ME05000 WUXGA" ); +MODULE_LICENSE ("GPL v2" ); --2.1.2
Signature · 2 lines
regards, vinaysimha
Re: [PATCH v10 3/3] drm/panel: Add JDI LT070ME05000 WUXGA DSI Panel
In reply to Vinay Simha BNHi Thierry,
Could you please review the patch and integrate?
Quoted 681 lines · Vinay Simha BN
Add support for the JDI LT070ME05000 WUXGA DSI panel used in Nexus 7 2013 devices.
Programming sequence for the panel is was originally found in the android-msm-flo-3.4-lollipop-release branch from:
https://android.googlesource.com/kernel/msm.gitAnd video mode setting is from
dsi-panel-jdi-dualmipi1-video.dtsifile in:git://codeaurora.org/kernel/msm-3.10.git LNX.LA.3.6_rb1.27Cc Archit Taneja <[email protected]>Cc Rob Clark <[email protected]>Cc Sumit Semwal <[email protected]>Cc John Stultz <[email protected]>Cc Emil Velikov <[email protected]>Cc Thierry Reding <[email protected]>Cc David Airlie <[email protected]>Signed-off-by Sumit Semwal <[email protected]>Signed-off-by John Stultz <[email protected]>Signed-off-by Vinay Simha BN <[email protected]>Tested-by John Stultz <[email protected]>Reviewed-by Emil Velikov <[email protected]>---
v1:
* sumit ported to drm/panel framework, john cherry-picked to mainline, folded down other fixes from Vinay and Archit, vinay removed interface setting cmd mode, video mode panel selectedv2:
* incorporated code reviews from theiry, archit
code style, alphabetical soring inMakefile,Kconfig,regulator_bulk, arrays of u8, generic helper function, documentation bindings,v3:
* dcs backlight support added
* tested this panel driver in nexus7 2013 devicev4:
* backlight interface added in the panel driver
* incorporatedwidth_mmandheight_mmsuggested by rob herringv5:
* theirry review comments incorporated
panel model naming consistent, alphabetical soring inKconfigMakefile,MAX_BRIGHTNESSdropped,regulator_names, parameterize panel width and height, descprition for control display, cabc and interface setting, temporary variable removed, consistent error reporting and commit message
* removed tear on/off, scanline, since these are required only for command mode panelsv6:
* emil review comments incorporatedPANEL_NUM_REGULATORSdropped, return ret added at necessary places, if checks dropped for backlight and gpiosv7:
* emil review comments incorporated
addedARRAY_SIZEin struct,regulator_bulk_disablein poweroff, gpios checks dropped.
some returns cannot be dropped, since drm panel framework return type required.v8:
* emil review commnets incorporated forjdi_panel_unprepare, dropped the returns (ref:panel-sharp-lq101r1sx01.c) and forjdi_panel_prepare(panel_on)it does not return prematurely and goes to poweroff if not success
* few dev_err's forpanel_initv9:
* functiondrm_panel_create_dsi_backlightmade as staticv10:
* proper naming conventions and sequence wrt panel datasheet (vddp-supply, iovcc-supply,
enable-gpios, reset-gpios, dcdc-en-gpios)
*GPIO_ACTIVE_LOWpolarity logic for reset-gpios--- drivers/gpu/drm/panel/Kconfig | 11 + drivers/gpu/drm/panel/Makefile | 1 + drivers/gpu/drm/panel/panel-jdi-lt070me05000.c | 532 +++++++++++++++++++++++++ 3 files changed, 544 insertions(+) create mode 100644 drivers/gpu/drm/panel/panel-jdi-lt070me05000.cdrivers/gpu/drm/panel/Kconfig +0
-0@@ -18,6 +18,17 @@ config DRM_PANEL_SIMPLE that it can be automatically turned off when the panel goes intoa
low power state.drivers/gpu/drm/panel/Kconfig +11
-0+config DRM_PANEL_JDI_LT070ME05000 + tristate "JDI LT070ME05000 WUXGA DSI 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 JDI DSI video mode + panel as found in Google Nexus 7 (2013) devices. + The panel has a 1200(RGB)×1920 (WUXGA) resolution and uses + 24 bit per pixel. + config DRM_PANEL_SAMSUNG_LD9040 tristate "Samsung LD9040 RGB/SPI panel" depends on OF && SPIdrivers/gpu/drm/panel/ renamed from drivers/gpu/drm/panel/Makefile +0
-0
Makefile
index f277eed..a5c7ec0 100644drivers/gpu/drm/panel/Makefile +1
-0@@ -1,4 +1,5 @@ obj-$(CONFIG_DRM_PANEL_SIMPLE) += panel-simple.o +obj-$(CONFIG_DRM_PANEL_JDI_LT070ME05000) += panel-jdi-lt070me05000.o obj-$(CONFIG_DRM_PANEL_LG_LG4573) += panel-lg-lg4573.o obj-$(CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00) +=panel-panasonic-vvx10f034n00.o
obj-$(CONFIG_DRM_PANEL_SAMSUNG_LD9040) += panel-samsung-ld9040.odrivers/gpu/drm/panel/panel-jdi-lt070me05000.c new file +13
-0@@ -0,0 +1,532 @@ +/* +* Copyright (C) 2016 InforceComputing +* Author: Vinay Simha BN <[email protected]> +* +* Copyright (C) 2016 Linaro Ltd +* Author: Sumit Semwal <[email protected]> +* +* From internet archives, the panel for Nexus 7 2nd Gen, 2013 model is a +* JDI model LT070ME05000, and its data sheet is at: +* http://panelone.net/en/7-0-inch/JDI_LT070ME05000_7.0_inch-datasheet +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */drivers/gpu/drm/panel/panel-jdi-lt070me05000.c new file +55
-0+#include <linux/backlight.h> +#include <linux/gpio/consumer.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/regulator/consumer.h> + +#include <drm/drmP.h> +#include <drm/drm_crtc.h> +#include <drm/drm_mipi_dsi.h> +#include <drm/drm_panel.h> + +#include <video/mipi_display.h> + +static const char *const regulator_names[] = { +"vddp" , +"iovcc" +}; + +struct jdi_panel { +struct drm_panel base; +struct mipi_dsi_device *dsi; + +struct regulator_bulk_data supplies[ARRAY_SIZE (regulator_names)]; + +struct gpio_desc *enable_gpio; +struct gpio_desc *reset_gpio; +struct gpio_desc *dcdc_en_gpio; +struct backlight_device *backlight; + +bool prepared; +bool enabled; + +const struct drm_display_mode *mode; +}; + +static inline struct jdi_panel *to_jdi_panel (struct drm_panel *panel) +{ + return container_of(panel, struct jdi_panel, base); +} + +static int jdi_panel_init (struct jdi_panel *jdi) +{ +struct mipi_dsi_device *dsi = jdi->dsi; +struct device *dev = &jdi->dsi->dev; +int ret; + + dsi->mode_flags |=MIPI_DSI_MODE_LPM ; + + ret =mipi_dsi_dcs_soft_reset (dsi); +if (ret <0 ) +return ret; + +usleep_range (10000 ,20000 ); + + ret = mipi_dsi_dcs_set_pixel_format(dsi, MIPI_DCS_PIXEL_FMT_24BIT<< 4);
drivers/gpu/drm/panel/panel-jdi-lt070me05000.c new file +12
-1+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, jdi->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, jdi->mode->vdisplay -1);
drivers/gpu/drm/panel/panel-jdi-lt070me05000.c new file +7
-0+if (ret <0 ) { +dev_err (dev,"failed to set page address: %d\n" , ret); +return ret; + } + +/* +* BIT(5) BCTRL = 1 Backlight Control Block On, Brightness registers
drivers/gpu/drm/panel/panel-jdi-lt070me05000.c new file +38
-0+* are active +* BIT(3) BL = 1 Backlight Control On +* BIT(2) DD = 0 Display Dimming is Off +*/ + ret =mipi_dsi_dcs_write (dsi,MIPI_DCS_WRITE_CONTROL_DISPLAY , + (u8 []){0x24 },1 ); +if (ret <0 ) { +dev_err (dev,"failed to write control display: %d\n" , ret); +return ret; + } + +/* CABC off */ + ret =mipi_dsi_dcs_write (dsi,MIPI_DCS_WRITE_POWER_SAVE , + (u8 []){0x00 },1 ); +if (ret <0 ) { +dev_err (dev,"failed to set cabc off: %d\n" , ret); +return ret; + } + + 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 ); + + ret =mipi_dsi_generic_write (dsi, (u8 []){0xB0 ,0x00 },2 ); +if (ret <0 ) { +dev_err (dev,"failed to set mcap: %d\n" , ret); +return ret; + } + +mdelay (10 ); + +/* Interface setting, video mode */ + ret = mipi_dsi_generic_write(dsi, (u8[]) + {0xB3, 0x26, 0x08, 0x00, 0x20, 0x00},6);
drivers/gpu/drm/panel/panel-jdi-lt070me05000.c new file +2
-0+if (ret <0 ) { + dev_err(dev, "failed to set display interface setting:%d\n"
drivers/gpu/drm/panel/panel-jdi-lt070me05000.c new file +77
-0+ , ret); +return ret; + } + +mdelay (20 ); + + ret =mipi_dsi_generic_write (dsi, (u8 []){0xB0 ,0x03 },2 ); +if (ret <0 ) { +dev_err (dev,"failed to set default values for mcap: %d\n" + , ret); +return ret; + } + +return 0 ; +} + +static int jdi_panel_on (struct jdi_panel *jdi) +{ +struct mipi_dsi_device *dsi = jdi->dsi; +struct device *dev = &jdi->dsi->dev; +int ret; + + dsi->mode_flags |=MIPI_DSI_MODE_LPM ; + + ret =mipi_dsi_dcs_set_display_on (dsi); +if (ret <0 ) +dev_err (dev,"failed to set display on: %d\n" , ret); + +return ret; +} + +static void jdi_panel_off (struct jdi_panel *jdi) +{ +struct mipi_dsi_device *dsi = jdi->dsi; +struct device *dev = &jdi->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 jdi_panel_disable (struct drm_panel *panel) +{ +struct jdi_panel *jdi =to_jdi_panel (panel); + +if (!jdi->enabled) +return 0 ; + + jdi->backlight->props.power =FB_BLANK_POWERDOWN ; +backlight_update_status (jdi->backlight); + + jdi->enabled = false; + +return 0 ; +} + +static int jdi_panel_unprepare (struct drm_panel *panel) +{ +struct jdi_panel *jdi =to_jdi_panel (panel); +struct device *dev = &jdi->dsi->dev; +int ret; + +if (!jdi->prepared) +return 0 ; + +jdi_panel_off (jdi); + + ret = regulator_bulk_disable(ARRAY_SIZE(jdi->supplies),
jdi->supplies);drivers/gpu/drm/panel/panel-jdi-lt070me05000.c new file +24
-0+if (ret <0 ) +dev_err (dev,"regulator disable failed, %d\n" , ret); + +gpiod_set_value (jdi->enable_gpio,0 ); + +gpiod_set_value (jdi->reset_gpio,1 ); + +gpiod_set_value (jdi->dcdc_en_gpio,0 ); + + jdi->prepared = false; + +return 0 ; +} + +static int jdi_panel_prepare (struct drm_panel *panel) +{ +struct jdi_panel *jdi =to_jdi_panel (panel); +struct device *dev = &jdi->dsi->dev; +int ret; + +if (jdi->prepared) +return 0 ; + + ret = regulator_bulk_enable(ARRAY_SIZE(jdi->supplies),
jdi->supplies);drivers/gpu/drm/panel/panel-jdi-lt070me05000.c new file +34
-0+if (ret <0 ) { +dev_err (dev,"regulator enable failed, %d\n" , ret); +return ret; + } + +msleep (20 ); + +gpiod_set_value (jdi->dcdc_en_gpio,1 ); +usleep_range (10 ,20 ); + +gpiod_set_value (jdi->reset_gpio,0 ); +usleep_range (10 ,20 ); + +gpiod_set_value (jdi->enable_gpio,1 ); +usleep_range (10 ,20 ); + + ret =jdi_panel_init (jdi); +if (ret <0 ) { +dev_err (dev,"failed to init panel: %d\n" , ret); + goto poweroff; + } + + ret =jdi_panel_on (jdi); +if (ret <0 ) { +dev_err (dev,"failed to set panel on: %d\n" , ret); + goto poweroff; + } + + jdi->prepared = true; + +return 0 ; + +poweroff: + ret = regulator_bulk_disable(ARRAY_SIZE(jdi->supplies),
jdi->supplies);drivers/gpu/drm/panel/panel-jdi-lt070me05000.c new file +90
-0+if (ret <0 ) +dev_err (dev,"regulator disable failed, %d\n" , ret); + +gpiod_set_value (jdi->enable_gpio,0 ); + +gpiod_set_value (jdi->reset_gpio,1 ); + +gpiod_set_value (jdi->dcdc_en_gpio,0 ); + +return ret; +} + +static int jdi_panel_enable (struct drm_panel *panel) +{ +struct jdi_panel *jdi =to_jdi_panel (panel); + +if (jdi->enabled) +return 0 ; + + jdi->backlight->props.power =FB_BLANK_UNBLANK ; +backlight_update_status (jdi->backlight); + + jdi->enabled = true; + +return 0 ; +} + +static const struct drm_display_mode default_mode = { + .clock =155493 , + .hdisplay =1200 , + .hsync_start =1200 +48 , + .hsync_end =1200 +48 +32 , + .htotal =1200 +48 +32 +60 , + .vdisplay =1920 , + .vsync_start =1920 +3 , + .vsync_end =1920 +3 +5 , + .vtotal =1920 +3 +5 +6 , + .vrefresh =60 , + .flags =0 , +}; + +static int jdi_panel_get_modes (struct drm_panel *panel) +{ +struct drm_display_mode *mode; +struct jdi_panel *jdi =to_jdi_panel (panel); +struct device *dev = &jdi->dsi->dev; + + mode =drm_mode_duplicate (panel->drm, &default_mode); +if (!mode) { +dev_err (dev,"failed to add mode %ux%ux@%u\n" , + default_mode.hdisplay, default_mode.vdisplay, + default_mode.vrefresh); +return -ENOMEM ; + } + +drm_mode_set_name (mode); + +drm_mode_probed_add (panel->connector, mode); + + panel->connector->display_info.width_mm =95 ; + panel->connector->display_info.height_mm =151 ; + +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); +int ret; + + dsi->mode_flags &= ~MIPI_DSI_MODE_LPM ; + + ret = mipi_dsi_dcs_set_display_brightness(dsi,
bl->props.brightness);drivers/gpu/drm/panel/panel-jdi-lt070me05000.c new file +25
-0+if (ret <0 ) +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; + +memset (&props,0 ,sizeof (props)); + props.type =BACKLIGHT_RAW ; + props.brightness =255 ; + props.max_brightness =255 ; + + return devm_backlight_device_register(dev, dev_name(dev), dev,dsi,
drivers/gpu/drm/panel/panel-jdi-lt070me05000.c new file +145
-1+ &dsi_bl_ops, &props); +} + +static const struct drm_panel_funcs jdi_panel_funcs = { + .disable = jdi_panel_disable, + .unprepare = jdi_panel_unprepare, + .prepare = jdi_panel_prepare, + .enable = jdi_panel_enable, + .get_modes = jdi_panel_get_modes, +}; + +static const struct of_device_id jdi_of_match[] = { + { .compatible ="jdi,lt070me05000" , }, + { } +}; +MODULE_DEVICE_TABLE (of, jdi_of_match); + +static int jdi_panel_add (struct jdi_panel *jdi) +{ +struct device *dev = &jdi->dsi->dev; +int ret; +unsigned int i; + + jdi->mode = &default_mode; + +for (i =0 ; i <ARRAY_SIZE (jdi->supplies); i++) + jdi->supplies[i].supply = regulator_names[i]; + + ret =devm_regulator_bulk_get (dev,ARRAY_SIZE (jdi->supplies), + jdi->supplies); +if (ret <0 ) { +dev_err (dev,"failed to init regulator, ret=%d\n" , ret); +return ret; + } + + jdi->enable_gpio =devm_gpiod_get (dev,"enable" ,GPIOD_OUT_LOW ); +if (IS_ERR (jdi->enable_gpio)) { + ret =PTR_ERR (jdi->enable_gpio); +dev_err (dev,"cannot get enable-gpio %d\n" , ret); +return ret; + } + + jdi->reset_gpio =devm_gpiod_get (dev,"reset" ,GPIOD_OUT_HIGH ); +if (IS_ERR (jdi->reset_gpio)) { + ret =PTR_ERR (jdi->reset_gpio); +dev_err (dev,"cannot get reset-gpios %d\n" , ret); +return ret; + } + + jdi->dcdc_en_gpio =devm_gpiod_get (dev,"dcdc-en" ,GPIOD_OUT_LOW ); +if (IS_ERR (jdi->dcdc_en_gpio)) { + ret =PTR_ERR (jdi->dcdc_en_gpio); +dev_err (dev,"cannot get dcdc-en-gpio %d\n" , ret); +return ret; + } + + jdi->backlight =drm_panel_create_dsi_backlight (jdi->dsi); +if (IS_ERR (jdi->backlight)) { + ret =PTR_ERR (jdi->backlight); +dev_err (dev,"failed to register backlight %d\n" , ret); +return ret; + } + +drm_panel_init (&jdi->base); + jdi->base.funcs = &jdi_panel_funcs; + jdi->base.dev = &jdi->dsi->dev; + + ret =drm_panel_add (&jdi->base); + +return ret; +} + +static void jdi_panel_del (struct jdi_panel *jdi) +{ +if (jdi->base.dev) +drm_panel_remove (&jdi->base); +} + +static int jdi_panel_probe (struct mipi_dsi_device *dsi) +{ +struct jdi_panel *jdi; +int ret; + + dsi->lanes =4 ; + dsi->format =MIPI_DSI_FMT_RGB888 ; + dsi->mode_flags =MIPI_DSI_MODE_VIDEO_HSE |MIPI_DSI_MODE_VIDEO | +MIPI_DSI_CLOCK_NON_CONTINUOUS ; + + jdi =devm_kzalloc (&dsi->dev,sizeof (*jdi),GFP_KERNEL ); +if (!jdi) +return -ENOMEM ; + +mipi_dsi_set_drvdata (dsi, jdi); + + jdi->dsi = dsi; + + ret =jdi_panel_add (jdi); +if (ret <0 ) +return ret; + +return mipi_dsi_attach (dsi); +} + +static int jdi_panel_remove (struct mipi_dsi_device *dsi) +{ +struct jdi_panel *jdi =mipi_dsi_get_drvdata (dsi); +int ret; + + ret =jdi_panel_disable (&jdi->base); +if (ret <0 ) +dev_err (&dsi->dev,"failed to disable panel: %d\n" , ret); + + ret =mipi_dsi_detach (dsi); +if (ret <0 ) +dev_err (&dsi->dev,"failed to detach from DSI host: %d\n" , + ret); + +drm_panel_detach (&jdi->base); +jdi_panel_del (jdi); + +return 0 ; +} + +static void jdi_panel_shutdown (struct mipi_dsi_device *dsi) +{ +struct jdi_panel *jdi =mipi_dsi_get_drvdata (dsi); + +jdi_panel_disable (&jdi->base); +} + +static struct mipi_dsi_driver jdi_panel_driver = { + .driver = { + .name ="panel-jdi-lt070me05000" , + .of_match_table = jdi_of_match, + }, + .probe = jdi_panel_probe, + .remove = jdi_panel_remove, + .shutdown = jdi_panel_shutdown, +}; +module_mipi_dsi_driver (jdi_panel_driver); + +MODULE_AUTHOR ("Sumit Semwal <[email protected]>" ); +MODULE_AUTHOR ("Vinay Simha BN <[email protected]>" ); +MODULE_DESCRIPTION ("JDI LT070ME05000 WUXGA" ); +MODULE_LICENSE ("GPL v2" ); --2.1.2
Signature · 2 lines
regards, vinaysimha
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Thierry Reding
AppliedRe: [PATCH v10 3/3] drm/panel: Add JDI LT070ME05000 WUXGA DSI Panel
In reply to Vinay Simha BNQuoted 80 lines · Vinay Simha BN
Add support for the JDI LT070ME05000 WUXGA DSI panel used in Nexus 7 2013 devices.
Programming sequence for the panel is was originally found in the android-msm-flo-3.4-lollipop-release branch from:
https://android.googlesource.com/kernel/msm.gitAnd video mode setting is from
dsi-panel-jdi-dualmipi1-video.dtsifile in:git://codeaurora.org/kernel/msm-3.10.git LNX.LA.3.6_rb1.27Cc Archit Taneja <[email protected]>Cc Rob Clark <[email protected]>Cc Sumit Semwal <[email protected]>Cc John Stultz <[email protected]>Cc Emil Velikov <[email protected]>Cc Thierry Reding <[email protected]>Cc David Airlie <[email protected]>Signed-off-by Sumit Semwal <[email protected]>Signed-off-by John Stultz <[email protected]>Signed-off-by Vinay Simha BN <[email protected]>Tested-by John Stultz <[email protected]>Reviewed-by Emil Velikov <[email protected]>---
v1:
* sumit ported to drm/panel framework, john cherry-picked to mainline, folded down other fixes from Vinay and Archit, vinay removed interface setting cmd mode, video mode panel selectedv2:
* incorporated code reviews from theiry, archit
code style, alphabetical soring inMakefile,Kconfig,regulator_bulk, arrays of u8, generic helper function, documentation bindings,v3:
* dcs backlight support added
* tested this panel driver in nexus7 2013 devicev4:
* backlight interface added in the panel driver
* incorporatedwidth_mmandheight_mmsuggested by rob herringv5:
* theirry review comments incorporated
panel model naming consistent, alphabetical soring inKconfigMakefile,MAX_BRIGHTNESSdropped,regulator_names, parameterize panel width and height, descprition for control display, cabc and interface setting, temporary variable removed, consistent error reporting and commit message
* removed tear on/off, scanline, since these are required only for command mode panelsv6:
* emil review comments incorporatedPANEL_NUM_REGULATORSdropped, return ret added at necessary places, if checks dropped for backlight and gpiosv7:
* emil review comments incorporated
addedARRAY_SIZEin struct,regulator_bulk_disablein poweroff, gpios checks dropped.
some returns cannot be dropped, since drm panel framework return type required.v8:
* emil review commnets incorporated forjdi_panel_unprepare, dropped the returns (ref:panel-sharp-lq101r1sx01.c) and forjdi_panel_prepare(panel_on)it does not return prematurely and goes to poweroff if not success
* few dev_err's forpanel_initv9:
* functiondrm_panel_create_dsi_backlightmade as staticv10:
* proper naming conventions and sequence wrt panel datasheet (vddp-supply, iovcc-supply,
enable-gpios, reset-gpios, dcdc-en-gpios)
*GPIO_ACTIVE_LOWpolarity logic for reset-gpios
Quoted 6 lines
--- drivers/gpu/drm/panel/Kconfig | 11 + drivers/gpu/drm/panel/Makefile | 1 + drivers/gpu/drm/panel/panel-jdi-lt070me05000.c | 532 +++++++++++++++++++++++++ 3 files changed, 544 insertions(+) create mode 100644 drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
Applied, thanks.
Thierry
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Rob Herring
maintainerQuoted 11 lines · Vinay Simha BN
Add vendor id for Japan Display Inc.
Cc Archit Taneja <[email protected]>Cc John Stultz <[email protected]>Cc Thierry Reding <[email protected]>Cc Sumit Semwal <[email protected]>Signed-off-by Vinay Simha BN <[email protected]>Acked-by Rob Herring <[email protected]>--- Documentation/devicetree/bindings/vendor-prefixes.txt | 1 + 1 file changed, 1 insertion(+)
I applied this one because vendor-prefixes.txt has some alphabetizing fixes.
Rob
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html