* [PATCH 1/4] dt-bindings: Add Japan Display Inc vendor id
@ 2016-07-13 16:44 Vinay Simha BN
2016-07-13 16:44 ` [PATCH v2 2/4] dt-bindings: Add jdi lt070me05000 panel bindings Vinay Simha BN
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Vinay Simha BN @ 2016-07-13 16:44 UTC (permalink / raw)
Cc: Vinay Simha BN, Archit Taneja, John Stultz, Thierry Reding,
Sumit Semwal, Rob Herring, Mark Rutland, Thierry Reding,
Jonathan Cameron, Shawn Guo, Jarkko Sakkinen,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
open list
Add vendor id for Japan Display Inc.
Cc: Archit Taneja <archit.taneja@gmail.com>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Sumit Semwal <sumit.semwal@linaro.org>
Signed-off-by: Vinay Simha BN <simhavcs@gmail.com>
Acked-by: Rob Herring <robh@kernel.org>
---
Documentation/devicetree/bindings/vendor-prefixes.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt
index ecc8cf4..1b134f3 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
@@ -138,6 +138,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
--
1.9.1
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v2 2/4] dt-bindings: Add jdi lt070me05000 panel bindings
2016-07-13 16:44 [PATCH 1/4] dt-bindings: Add Japan Display Inc vendor id Vinay Simha BN
@ 2016-07-13 16:44 ` Vinay Simha BN
2016-07-13 16:44 ` [PATCH v2 3/4] drm/dsi: Implement dcs set/get display brightness Vinay Simha BN
2016-07-13 16:44 ` [PATCH v8 4/4] drm/panel: Add JDI LT070ME05000 WUXGA DSI Panel Vinay Simha BN
2 siblings, 0 replies; 11+ messages in thread
From: Vinay Simha BN @ 2016-07-13 16:44 UTC (permalink / raw)
Cc: Vinay Simha BN, Archit Taneja, John Stultz, Thierry Reding,
Sumit Semwal, David Airlie, Rob Herring, Mark Rutland,
open list:DRM PANEL DRIVERS,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
open list
Add documentation for lt070me05000 panel
Cc: Archit Taneja <archit.taneja@gmail.com>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Sumit Semwal <sumit.semwal@linaro.org>
Signed-off-by: Vinay Simha BN <simhavcs@gmail.com>
Acked-by: Rob Herring <robh@kernel.org>
---
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
---
.../bindings/display/panel/jdi,lt070me05000.txt | 57 ++++++++++++++++++++++
1 file changed, 57 insertions(+)
create mode 100644 Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
diff --git a/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt b/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
new file mode 100644
index 0000000..613b76f
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
@@ -0,0 +1,57 @@
+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)
+- dcdc_en-supply: phandle of the regulator that provides the supply voltage
+ Power IC supply enable, High active
+- vcc-supply: phandle of the regulator that provides the supply voltage
+ IOVCC , power supply for LCM (1.8V)
+- 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
+- enable-gpios: phandle of gpio for enable line
+ LED_EN, LED backlight enable, High active
+
+Example:
+
+ vcc_1p8v: regulator-fixed@2 {
+ compatible = "regulator-fixed";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "vcc_1p8v";
+ regulator-type = "voltage";
+ startup-delay-us = <0>;
+ gpio = <&pm8921_gpio 23 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+ regulator-boot-on;
+ };
+
+ tlmm_pinmux: pinctrl@800000 {
+
+ dsi_panel_pinctrl: dsi-panel-pinctrl {
+ mux {
+ pins = "gpio54";
+ function = "gpio";
+ bias-pull-up;
+ drive-strength = <8>;
+ };
+ };
+ };
+
+ dsi0: qcom,mdss_dsi@4700000 {
+ panel@0 {
+ compatible = "jdi,lt070me05000";
+ reg = <0>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&dsi_panel_pinctrl>;
+
+ vddp-supply = <&pm8921_l17>;
+ dcdc_en-supply = <&pm8921_lvs7>;
+ vcc-supply = <&vcc_1p8v>;
+
+ reset-gpios = <&tlmm_pinmux 54 0>;
+ enable-gpios = <&pm8921_gpio 36 GPIO_ACTIVE_HIGH>;
+ };
+ };
--
1.9.1
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v2 3/4] drm/dsi: Implement dcs set/get display brightness
2016-07-13 16:44 [PATCH 1/4] dt-bindings: Add Japan Display Inc vendor id Vinay Simha BN
2016-07-13 16:44 ` [PATCH v2 2/4] dt-bindings: Add jdi lt070me05000 panel bindings Vinay Simha BN
@ 2016-07-13 16:44 ` Vinay Simha BN
2016-07-14 21:20 ` Emil Velikov
2016-07-13 16:44 ` [PATCH v8 4/4] drm/panel: Add JDI LT070ME05000 WUXGA DSI Panel Vinay Simha BN
2 siblings, 1 reply; 11+ messages in thread
From: Vinay Simha BN @ 2016-07-13 16:44 UTC (permalink / raw)
Cc: Vinay Simha BN, John Stultz, Sumit Semwal, Archit Taneja,
Rob Clark, Jani Nikula, Thierry Reding, David Airlie,
open list:DRM DRIVERS, open list
Provide a small convenience wrapper that set/get the
display brightness value
Cc: John Stultz <john.stultz@linaro.org>
Cc: Sumit Semwal <sumit.semwal@linaro.org>
Cc: Archit Taneja <archit.taneja@gmail.com>
Cc: Rob Clark <robdclark@gmail.com>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Signed-off-by: Vinay Simha BN <simhavcs@gmail.com>
---
v1:
*tested in nexus7 2nd gen.
v2:
* implemented jani review comments
-functions name mapped accordingly
-bl value increased from 0xff to 0xffff
-backlight interface will be handled in panel driver,
so it is moved from the mipi_dsi helper function
---
drivers/gpu/drm/drm_mipi_dsi.c | 49 ++++++++++++++++++++++++++++++++++++++++++
include/drm/drm_mipi_dsi.h | 4 ++++
2 files changed, 53 insertions(+)
diff --git a/drivers/gpu/drm/drm_mipi_dsi.c b/drivers/gpu/drm/drm_mipi_dsi.c
index af0d471..7c22f64 100644
--- a/drivers/gpu/drm/drm_mipi_dsi.c
+++ b/drivers/gpu/drm/drm_mipi_dsi.c
@@ -1041,6 +1041,55 @@ int mipi_dsi_dcs_set_pixel_format(struct mipi_dsi_device *dsi, u8 format)
}
EXPORT_SYMBOL(mipi_dsi_dcs_set_pixel_format);
+/**
+ * mipi_dsi_dcs_get_display_brightness() - gets the current brightness value
+ * of the display
+ * @dsi: DSI peripheral device
+ * @brightness: brightness value
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
+int mipi_dsi_dcs_get_display_brightness(struct mipi_dsi_device *dsi,
+ u16 *brightness)
+{
+ ssize_t err;
+
+ err = mipi_dsi_dcs_read(dsi, MIPI_DCS_GET_DISPLAY_BRIGHTNESS,
+ brightness, sizeof(*brightness));
+ if (err < 0) {
+ if (err == 0)
+ err = -ENODATA;
+
+ return err;
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL(mipi_dsi_dcs_get_display_brightness);
+
+/**
+ * mipi_dsi_dcs_set_display_brightness() - sets the brightness value of
+ * the display
+ * @dsi: DSI peripheral device
+ * @brightness: brightness value
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
+int mipi_dsi_dcs_set_display_brightness(struct mipi_dsi_device *dsi,
+ u16 brightness)
+{
+ ssize_t err;
+ u8 bl_value[2] = { brightness & 0xff, brightness >> 8 };
+
+ err = mipi_dsi_dcs_write(dsi, MIPI_DCS_SET_DISPLAY_BRIGHTNESS,
+ bl_value, sizeof(bl_value));
+ if (err < 0)
+ return err;
+
+ return 0;
+}
+EXPORT_SYMBOL(mipi_dsi_dcs_set_display_brightness);
+
static int mipi_dsi_drv_probe(struct device *dev)
{
struct mipi_dsi_driver *drv = to_mipi_dsi_driver(dev->driver);
diff --git a/include/drm/drm_mipi_dsi.h b/include/drm/drm_mipi_dsi.h
index 47ac925..404c373 100644
--- a/include/drm/drm_mipi_dsi.h
+++ b/include/drm/drm_mipi_dsi.h
@@ -270,6 +270,10 @@ int mipi_dsi_dcs_set_tear_off(struct mipi_dsi_device *dsi);
int mipi_dsi_dcs_set_tear_on(struct mipi_dsi_device *dsi,
enum mipi_dsi_dcs_tear_mode mode);
int mipi_dsi_dcs_set_pixel_format(struct mipi_dsi_device *dsi, u8 format);
+int mipi_dsi_dcs_get_display_brightness(struct mipi_dsi_device *dsi,
+ u16 *brightness);
+int mipi_dsi_dcs_set_display_brightness(struct mipi_dsi_device *dsi,
+ u16 brightness);
/**
* struct mipi_dsi_driver - DSI driver
--
1.9.1
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v8 4/4] drm/panel: Add JDI LT070ME05000 WUXGA DSI Panel
2016-07-13 16:44 [PATCH 1/4] dt-bindings: Add Japan Display Inc vendor id Vinay Simha BN
2016-07-13 16:44 ` [PATCH v2 2/4] dt-bindings: Add jdi lt070me05000 panel bindings Vinay Simha BN
2016-07-13 16:44 ` [PATCH v2 3/4] drm/dsi: Implement dcs set/get display brightness Vinay Simha BN
@ 2016-07-13 16:44 ` Vinay Simha BN
2016-07-13 18:58 ` John Stultz
2 siblings, 1 reply; 11+ messages in thread
From: Vinay Simha BN @ 2016-07-13 16:44 UTC (permalink / raw)
Cc: Vinay Simha BN, Archit Taneja, Rob Clark, Sumit Semwal,
John Stultz, Emil Velikov, Thierry Reding, David Airlie,
open list, open list:DRM PANEL DRIVERS
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.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
Cc: Archit Taneja <archit.taneja@gmail.com>
Cc: Rob Clark <robdclark@gmail.com>
Cc: Sumit Semwal <sumit.semwal@linaro.org>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Emil Velikov <emil.l.velikov@gmail.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: David Airlie <airlied@linux.ie>
Signed-off-by: Sumit Semwal <sumit.semwal@linaro.org>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Vinay Simha BN <simhavcs@gmail.com>
---
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
---
drivers/gpu/drm/panel/Kconfig | 11 +
drivers/gpu/drm/panel/Makefile | 1 +
drivers/gpu/drm/panel/panel-jdi-lt070me05000.c | 518 +++++++++++++++++++++++++
3 files changed, 530 insertions(+)
create mode 100644 drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig
index 1500ab9..62aba97 100644
--- a/drivers/gpu/drm/panel/Kconfig
+++ b/drivers/gpu/drm/panel/Kconfig
@@ -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
diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile
index f277eed..a5c7ec0 100644
--- a/drivers/gpu/drm/panel/Makefile
+++ b/drivers/gpu/drm/panel/Makefile
@@ -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
diff --git a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
new file mode 100644
index 0000000..d54c472
--- /dev/null
+++ b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
@@ -0,0 +1,518 @@
+/*
+ * Copyright (C) 2016 InforceComputing
+ * Author: Vinay Simha BN <simhavcs@gmail.com>
+ *
+ * Copyright (C) 2016 Linaro Ltd
+ * Author: Sumit Semwal <sumit.semwal@linaro.org>
+ *
+ * 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",
+ "dcdc_en",
+ "vcc"
+};
+
+struct jdi_panel {
+ struct drm_panel base;
+ struct mipi_dsi_device *dsi;
+
+ struct regulator_bulk_data supplies[ARRAY_SIZE(regulator_names)];
+
+ struct gpio_desc *reset_gpio;
+ struct gpio_desc *enable_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, 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->reset_gpio, 1);
+ 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, 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,
+};
+
+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->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+ 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->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->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 <sumit.semwal@linaro.org>");
+MODULE_AUTHOR("Vinay Simha BN <simhavcs@gmail.com>");
+MODULE_DESCRIPTION("JDI LT070ME05000 WUXGA");
+MODULE_LICENSE("GPL v2");
--
1.9.1
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH v8 4/4] drm/panel: Add JDI LT070ME05000 WUXGA DSI Panel
2016-07-13 16:44 ` [PATCH v8 4/4] drm/panel: Add JDI LT070ME05000 WUXGA DSI Panel Vinay Simha BN
@ 2016-07-13 18:58 ` John Stultz
2016-07-14 21:18 ` Emil Velikov
0 siblings, 1 reply; 11+ messages in thread
From: John Stultz @ 2016-07-13 18:58 UTC (permalink / raw)
To: Vinay Simha BN
Cc: Archit Taneja, Rob Clark, Sumit Semwal, Emil Velikov,
Thierry Reding, David Airlie, open list,
open list:DRM PANEL DRIVERS
On Wed, Jul 13, 2016 at 9:44 AM, Vinay Simha BN <simhavcs@gmail.com> wrote:
> 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.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
>
> Cc: Archit Taneja <archit.taneja@gmail.com>
> Cc: Rob Clark <robdclark@gmail.com>
> Cc: Sumit Semwal <sumit.semwal@linaro.org>
> Cc: John Stultz <john.stultz@linaro.org>
> Cc: Emil Velikov <emil.l.velikov@gmail.com>
> Cc: Thierry Reding <thierry.reding@gmail.com>
> Cc: David Airlie <airlied@linux.ie>
> Signed-off-by: Sumit Semwal <sumit.semwal@linaro.org>
> Signed-off-by: John Stultz <john.stultz@linaro.org>
> Signed-off-by: Vinay Simha BN <simhavcs@gmail.com>
Just fyi, I've re-integrated this patch set into my flo-WIP branch and
its working well.
I dunno if its of any use, but:
Tested-by: John Stultz <john.stultz@linaro.org>
thanks
-john
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v8 4/4] drm/panel: Add JDI LT070ME05000 WUXGA DSI Panel
2016-07-13 18:58 ` John Stultz
@ 2016-07-14 21:18 ` Emil Velikov
0 siblings, 0 replies; 11+ messages in thread
From: Emil Velikov @ 2016-07-14 21:18 UTC (permalink / raw)
To: John Stultz
Cc: Vinay Simha BN, Archit Taneja, Rob Clark, Sumit Semwal,
Thierry Reding, David Airlie, open list,
open list:DRM PANEL DRIVERS
On 13 July 2016 at 19:58, John Stultz <john.stultz@linaro.org> wrote:
> On Wed, Jul 13, 2016 at 9:44 AM, Vinay Simha BN <simhavcs@gmail.com> wrote:
>> 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.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
>>
>> Cc: Archit Taneja <archit.taneja@gmail.com>
>> Cc: Rob Clark <robdclark@gmail.com>
>> Cc: Sumit Semwal <sumit.semwal@linaro.org>
>> Cc: John Stultz <john.stultz@linaro.org>
>> Cc: Emil Velikov <emil.l.velikov@gmail.com>
>> Cc: Thierry Reding <thierry.reding@gmail.com>
>> Cc: David Airlie <airlied@linux.ie>
>> Signed-off-by: Sumit Semwal <sumit.semwal@linaro.org>
>> Signed-off-by: John Stultz <john.stultz@linaro.org>
>> Signed-off-by: Vinay Simha BN <simhavcs@gmail.com>
>
> Just fyi, I've re-integrated this patch set into my flo-WIP branch and
> its working well.
>
> I dunno if its of any use, but:
> Tested-by: John Stultz <john.stultz@linaro.org>
>
It always is. Thank you!
Vinay, thanks for the patience and I hope you grok the reason behind
the requested changes.
The patch is
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
Regards,
Emil
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RESEND][PATCH] drm/panel: Add JDI LT070ME05000 WUXGA DSI Panel
@ 2016-04-14 17:15 Rob Herring
2016-04-20 9:32 ` [PATCH v2 1/4] dt-bindings: Add jdi panel vendor Vinay Simha BN
0 siblings, 1 reply; 11+ messages in thread
From: Rob Herring @ 2016-04-14 17:15 UTC (permalink / raw)
To: Vinay Simha BN
Cc: Archit Taneja, Sumit Semwal, John Stultz, Thierry Reding,
Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala, David Airlie,
Ralf Baechle, Jonathan Cameron, Shawn Guo,
open list:DRM PANEL DRIVERS,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
open list
On Thu, Apr 14, 2016 at 04:17:45PM +0530, Vinay Simha BN wrote:
> 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.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
>
> Other fixes folded in were provided
> by Archit Taneja <archit.taneja@gmail.com>
>
> Cc: Archit Taneja <archit.taneja@gmail.com>
> Signed-off-by: Vinay Simha BN <simhavcs@gmail.com>
> [sumit.semwal: Ported to the drm/panel framework]
> Signed-off-by: Sumit Semwal <sumit.semwal@linaro.org>
> [jstultz: Cherry-picked to mainline, folded down other fixes
> from Vinay and Archit]
> Signed-off-by: John Stultz <john.stultz@linaro.org>
> Acked-by: John Stultz <john.stultz@linaro.org>
> [vinay simha bn: added interface setting cmd mode, cmd or video
> mode panel setting selection in panel_init based on mode_flags]
> Signed-off-by: Vinay Simha BN <simhavcs@gmail.com>
> ---
> .../bindings/display/panel/jdi,lt070me05000.txt | 27 +
> .../devicetree/bindings/vendor-prefixes.txt | 1 +
> drivers/gpu/drm/panel/Kconfig | 11 +
> drivers/gpu/drm/panel/Makefile | 1 +
> drivers/gpu/drm/panel/panel-jdi-lt070me05000.c | 685 +++++++++++++++++++++
> 5 files changed, 725 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
> create mode 100644 drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
>
> diff --git a/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt b/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
> new file mode 100644
> index 0000000..35c5ac7
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
> @@ -0,0 +1,27 @@
> +JDI model LT070ME05000 1920x1200 7" DSI Panel
> +
> +Basic data sheet is at:
> + http://panelone.net/en/7-0-inch/JDI_LT070ME05000_7.0_inch-datasheet
> +
> +This panel has video mode implemented currently in the driver.
As Thierry already mentioned, this has nothing to do with the binding.
> +
> +Required properties:
> +- compatible: should be "jdi,lt070me05000"
> +
> +Optional properties:
> +- power-supply: phandle of the regulator that provides the supply voltage
> +- reset-gpio: phandle of gpio for reset line
reset-gpios
> +- backlight: phandle of the backlight device attached to the panel
> +
> +Example:
> +
> + dsi@54300000 {
> + panel: panel@0 {
> + compatible = "jdi,lt070me05000";
> + reg = <0>;
> +
> + power-supply = <...>;
> + reset-gpio = <...>;
> + backlight = <...>;
> + };
> + };
> diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt
> index a580f3e..ec42bb4 100644
> --- a/Documentation/devicetree/bindings/vendor-prefixes.txt
> +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
> @@ -130,6 +130,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
> diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig
> index 1500ab9..f41690e 100644
> --- a/drivers/gpu/drm/panel/Kconfig
> +++ b/drivers/gpu/drm/panel/Kconfig
> @@ -61,6 +61,17 @@ config DRM_PANEL_SHARP_LQ101R1SX01
> To compile this driver as a module, choose M here: the module
> will be called panel-sharp-lq101r1sx01.
>
> +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 WUXGA DSI video/
> + command mode panel as found in Google Nexus 7 (2013) devices.
> + The panel has a 1200(RGB)×1920 (WUXGA) resolution and uses
> + 24 bit RGB per pixel.
> +
> config DRM_PANEL_SHARP_LS043T1LE01
> tristate "Sharp LS043T1LE01 qHD video mode panel"
> depends on OF
> diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile
> index f277eed..e6c6fc8 100644
> --- a/drivers/gpu/drm/panel/Makefile
> +++ b/drivers/gpu/drm/panel/Makefile
> @@ -5,3 +5,4 @@ obj-$(CONFIG_DRM_PANEL_SAMSUNG_LD9040) += panel-samsung-ld9040.o
> obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0) += panel-samsung-s6e8aa0.o
> obj-$(CONFIG_DRM_PANEL_SHARP_LQ101R1SX01) += panel-sharp-lq101r1sx01.o
> obj-$(CONFIG_DRM_PANEL_SHARP_LS043T1LE01) += panel-sharp-ls043t1le01.o
> +obj-$(CONFIG_DRM_PANEL_JDI_LT070ME05000) += panel-jdi-lt070me05000.o
> diff --git a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> new file mode 100644
> index 0000000..051aa1b
> --- /dev/null
> +++ b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> @@ -0,0 +1,685 @@
> +/*
> + * Copyright (C) 2015 InforceComputing
> + * Author: Vinay Simha BN <simhavcs@gmail.com>
> + *
> + * Copyright (C) 2015 Linaro Ltd
> + * Author: Sumit Semwal <sumit.semwal@linaro.org>
> + *
> + * 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>
> +
> +/*
> + * 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
> + */
> +struct jdi_panel {
> + struct drm_panel base;
> + struct mipi_dsi_device *dsi;
> +
> + /* TODO: Add backilght support */
> + struct backlight_device *backlight;
> + struct regulator *supply;
> + struct gpio_desc *reset_gpio;
> + struct gpio_desc *enable_gpio;
> + struct gpio_desc *vcc_gpio;
> +
> + struct regulator *backlit;
> + struct regulator *lvs7;
> + struct regulator *avdd;
> + struct regulator *iovdd;
> + struct gpio_desc *pwm_gpio;
> +
> + 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 char MCAP[2] = {0xB0, 0x00};
> +static char interface_setting_cmd[6] = {0xB3, 0x04, 0x08, 0x00, 0x22, 0x00};
> +static char interface_setting[6] = {0xB3, 0x26, 0x08, 0x00, 0x20, 0x00};
> +
> +static char interface_ID_setting[2] = {0xB4, 0x0C};
> +static char DSI_control[3] = {0xB6, 0x3A, 0xD3};
> +
> +static char tear_scan_line[3] = {0x44, 0x03, 0x00};
> +
> +/* for fps control, set fps to 60.32Hz */
> +static char LTPS_timing_setting[2] = {0xC6, 0x78};
> +static char sequencer_timing_control[2] = {0xD6, 0x01};
> +
> +/* set brightness */
> +static char write_display_brightness[] = {0x51, 0xFF};
> +/* enable LEDPWM pin output, turn on LEDPWM output, turn off pwm dimming */
> +static char write_control_display[] = {0x53, 0x24};
> +/*
> + * choose cabc mode, 0x00(-0%), 0x01(-15%), 0x02(-40%), 0x03(-54%),
> + * disable SRE(sunlight readability enhancement)
> + */
> +static char write_cabc[] = {0x55, 0x00};
> +/* for cabc mode 0x1(-15%) */
> +static char backlight_control1[] = {0xB8, 0x07, 0x87, 0x26, 0x18, 0x00, 0x32};
> +/* for cabc mode 0x2(-40%) */
> +static char backlight_control2[] = {0xB9, 0x07, 0x75, 0x61, 0x20, 0x16, 0x87};
> +/* for cabc mode 0x3(-54%) */
> +static char backlight_control3[] = {0xBA, 0x07, 0x70, 0x81, 0x20, 0x45, 0xB4};
> +/* for pwm frequency and dimming control */
> +static char backlight_control4[] = {0xCE, 0x7D, 0x40, 0x48, 0x56, 0x67, 0x78,
> + 0x88, 0x98, 0xA7, 0xB5, 0xC3, 0xD1, 0xDE, 0xE9, 0xF2, 0xFA,
> + 0xFF, 0x37, 0xF5, 0x0F, 0x0F, 0x42, 0x00};
> +
> +static int jdi_panel_init(struct jdi_panel *jdi)
> +{
> + struct mipi_dsi_device *dsi = jdi->dsi;
> + int ret;
> +
> + dsi->mode_flags |= MIPI_DSI_MODE_LPM;
> +
> + if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
> + ret = mipi_dsi_dcs_soft_reset(dsi);
> + if (ret < 0)
> + return ret;
> +
> + mdelay(10);
> +
> + ret = mipi_dsi_dcs_set_pixel_format(dsi, 0x70);
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_dcs_set_column_address(dsi, 0x0000, 0x04AF);
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_dcs_set_page_address(dsi, 0x0000, 0x077F);
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_dcs_set_tear_on(dsi,
> + MIPI_DSI_DCS_TEAR_MODE_VBLANK);
> + if (ret < 0)
> + return ret;
> + mdelay(5);
> +
> + ret = mipi_dsi_generic_write(dsi, tear_scan_line,
> + sizeof(tear_scan_line));
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_dcs_write_buffer(dsi, write_display_brightness,
> + sizeof(write_display_brightness)
> + );
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_dcs_write_buffer(dsi, write_control_display,
> + sizeof(write_control_display));
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_dcs_write_buffer(dsi, write_cabc,
> + sizeof(write_cabc));
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
> + if (ret < 0)
> + return ret;
> + mdelay(120);
> +
> + ret = mipi_dsi_generic_write(dsi, MCAP, sizeof(MCAP));
> + if (ret < 0)
> + return ret;
> + mdelay(10);
> +
> + ret = mipi_dsi_generic_write(dsi, interface_setting,
> + sizeof(interface_setting));
> + if (ret < 0)
> + return ret;
> + mdelay(20);
> +
> + backlight_control4[18] = 0x04;
> + backlight_control4[19] = 0x00;
> +
> + ret = mipi_dsi_generic_write(dsi, backlight_control4,
> + sizeof(backlight_control4));
> + if (ret < 0)
> + return ret;
> + mdelay(20);
> +
> + MCAP[1] = 0x03;
> + ret = mipi_dsi_generic_write(dsi, MCAP, sizeof(MCAP));
> + if (ret < 0)
> + return ret;
> + } else {
> + /*
> + * TODO : need to verify panel settings when
> + * dsi cmd mode supported for apq8064 - simhavcs
> + */
> + ret = mipi_dsi_dcs_soft_reset(dsi);
> + if (ret < 0)
> + return ret;
> +
> + mdelay(5);
> +
> + ret = mipi_dsi_generic_write(dsi, MCAP, sizeof(MCAP));
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_generic_write(dsi, interface_setting_cmd,
> + sizeof(interface_setting_cmd));
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_generic_write(dsi, interface_ID_setting,
> + sizeof(interface_ID_setting));
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_generic_write(dsi, DSI_control,
> + sizeof(DSI_control));
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_generic_write(dsi, LTPS_timing_setting,
> + sizeof(LTPS_timing_setting));
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_generic_write(dsi, sequencer_timing_control,
> + sizeof(sequencer_timing_control));
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_dcs_write_buffer(dsi, write_display_brightness,
> + sizeof(write_display_brightness)
> + );
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_dcs_write_buffer(dsi, write_control_display,
> + sizeof(write_control_display));
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_dcs_write_buffer(dsi, write_cabc,
> + sizeof(write_cabc));
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_generic_write(dsi, backlight_control1,
> + sizeof(backlight_control1));
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_generic_write(dsi, backlight_control2,
> + sizeof(backlight_control2));
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_generic_write(dsi, backlight_control3,
> + sizeof(backlight_control3));
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_generic_write(dsi, backlight_control4,
> + sizeof(backlight_control4));
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_dcs_set_pixel_format(dsi, 0x77);
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_dcs_set_column_address(dsi, 0x0000, 0x04AF);
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_dcs_set_page_address(dsi, 0x0000, 0x077F);
> + if (ret < 0)
> + return ret;
> + mdelay(120);
> +
> + ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
> + if (ret < 0)
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +static int jdi_panel_on(struct jdi_panel *jdi)
> +{
> + struct mipi_dsi_device *dsi = jdi->dsi;
> + int ret;
> +
> + dsi->mode_flags |= MIPI_DSI_MODE_LPM;
> +
> + ret = mipi_dsi_dcs_set_display_on(dsi);
> + if (ret < 0)
> + return ret;
> +
> + return 0;
> +}
> +
> +static int jdi_panel_off(struct jdi_panel *jdi)
> +{
> + struct mipi_dsi_device *dsi = jdi->dsi;
> + int ret;
> +
> + dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
> +
> + ret = mipi_dsi_dcs_set_display_off(dsi);
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_dcs_enter_sleep_mode(dsi);
> + if (ret < 0)
> + return ret;
> +
> + ret = mipi_dsi_dcs_set_tear_off(dsi);
> + if (ret < 0)
> + return ret;
> +
> + msleep(100);
> +
> + return 0;
> +}
> +
> +static int jdi_panel_disable(struct drm_panel *panel)
> +{
> + struct jdi_panel *jdi = to_jdi_panel(panel);
> +
> + if (!jdi->enabled)
> + return 0;
> +
> + DRM_DEBUG("disable\n");
> +
> + if (jdi->backlight) {
> + 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);
> + int ret;
> +
> + if (!jdi->prepared)
> + return 0;
> +
> + DRM_DEBUG("unprepare\n");
> +
> + ret = jdi_panel_off(jdi);
> + if (ret) {
> + dev_err(panel->dev, "failed to set panel off: %d\n", ret);
> + return ret;
> + }
> +
> + regulator_disable(jdi->supply);
> +
> + if (jdi->vcc_gpio)
> + gpiod_set_value(jdi->vcc_gpio, 0);
> +
> + if (jdi->reset_gpio)
> + gpiod_set_value(jdi->reset_gpio, 0);
> +
> + if (jdi->enable_gpio)
> + gpiod_set_value(jdi->enable_gpio, 0);
> +
> + jdi->prepared = false;
> +
> + return 0;
> +}
> +
> +static int jdi_panel_prepare(struct drm_panel *panel)
> +{
> + struct jdi_panel *jdi = to_jdi_panel(panel);
> + int ret;
> +
> + if (jdi->prepared)
> + return 0;
> +
> + DRM_DEBUG("prepare\n");
> +
> + ret = regulator_enable(jdi->iovdd);
> + if (ret < 0)
> + return ret;
> +
> + ret = regulator_enable(jdi->avdd);
> + if (ret < 0)
> + return ret;
> +
> + ret = regulator_enable(jdi->backlit);
> + if (ret < 0)
> + return ret;
> +
> + ret = regulator_enable(jdi->lvs7);
> + if (ret < 0)
> + return ret;
> +
> + ret = regulator_enable(jdi->supply);
> + if (ret < 0)
> + return ret;
> +
> + msleep(20);
> +
> + if (jdi->vcc_gpio) {
> + gpiod_set_value(jdi->vcc_gpio, 1);
> + usleep_range(10, 20);
> + }
> +
> + if (jdi->reset_gpio) {
> + gpiod_set_value(jdi->reset_gpio, 1);
> + usleep_range(10, 20);
> + }
> +
> + if (jdi->pwm_gpio) {
> + gpiod_set_value(jdi->pwm_gpio, 1);
> + usleep_range(10, 20);
> + }
> +
> + if (jdi->enable_gpio) {
> + gpiod_set_value(jdi->enable_gpio, 1);
> + usleep_range(10, 20);
> + }
> +
> + ret = jdi_panel_init(jdi);
> + if (ret) {
> + dev_err(panel->dev, "failed to init panel: %d\n", ret);
> + goto poweroff;
> + }
> +
> + ret = jdi_panel_on(jdi);
> + if (ret) {
> + dev_err(panel->dev, "failed to set panel on: %d\n", ret);
> + goto poweroff;
> + }
> +
> + jdi->prepared = true;
> +
> + return 0;
> +
> +poweroff:
> + regulator_disable(jdi->supply);
> + if (jdi->reset_gpio)
> + gpiod_set_value(jdi->reset_gpio, 0);
> + if (jdi->enable_gpio)
> + gpiod_set_value(jdi->enable_gpio, 0);
> + if (jdi->vcc_gpio)
> + gpiod_set_value(jdi->vcc_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;
> +
> + DRM_DEBUG("enable\n");
> +
> + if (jdi->backlight) {
> + 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 = 155000,
> + .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;
> +
> + mode = drm_mode_duplicate(panel->drm, &default_mode);
> + if (!mode) {
> + dev_err(panel->drm->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);
> +
> + return 1;
> +}
> +
> +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;
> +
> + jdi->mode = &default_mode;
> +
> + /* lvs5 */
> + jdi->supply = devm_regulator_get(dev, "power");
> + if (IS_ERR(jdi->supply))
> + return PTR_ERR(jdi->supply);
> +
> + /* l17 */
> + jdi->backlit = devm_regulator_get(dev, "backlit");
> + if (IS_ERR(jdi->supply))
> + return PTR_ERR(jdi->supply);
> +
> + jdi->lvs7 = devm_regulator_get(dev, "lvs7");
> + if (IS_ERR(jdi->lvs7))
> + return PTR_ERR(jdi->lvs7);
> +
> + jdi->avdd = devm_regulator_get(dev, "avdd");
> + if (IS_ERR(jdi->avdd))
> + return PTR_ERR(jdi->avdd);
> +
> + jdi->iovdd = devm_regulator_get(dev, "iovdd");
> + if (IS_ERR(jdi->iovdd))
> + return PTR_ERR(jdi->iovdd);
> +
> + jdi->vcc_gpio = devm_gpiod_get(dev, "vcc", GPIOD_OUT_LOW);
> + if (IS_ERR(jdi->vcc_gpio)) {
> + dev_err(dev, "cannot get vcc-gpio %ld\n",
> + PTR_ERR(jdi->vcc_gpio));
> + jdi->vcc_gpio = NULL;
> + } else {
> + gpiod_direction_output(jdi->vcc_gpio, 0);
> + }
> +
> + jdi->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
> + if (IS_ERR(jdi->reset_gpio)) {
> + dev_err(dev, "cannot get reset-gpios %ld\n",
> + PTR_ERR(jdi->reset_gpio));
> + jdi->reset_gpio = NULL;
> + } else {
> + gpiod_direction_output(jdi->reset_gpio, 0);
> + }
> +
> + jdi->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
> + if (IS_ERR(jdi->enable_gpio)) {
> + dev_err(dev, "cannot get enable-gpio %ld\n",
> + PTR_ERR(jdi->enable_gpio));
> + jdi->enable_gpio = NULL;
> + } else {
> + gpiod_direction_output(jdi->enable_gpio, 0);
> + }
> +
> + jdi->pwm_gpio = devm_gpiod_get(dev, "pwm", GPIOD_OUT_LOW);
> + if (IS_ERR(jdi->pwm_gpio)) {
> + dev_err(dev, "cannot get pwm-gpio %ld\n",
> + PTR_ERR(jdi->pwm_gpio));
> + jdi->pwm_gpio = NULL;
> + } else {
> + gpiod_direction_output(jdi->pwm_gpio, 0);
> + }
> +
> + /* we don't have backlight right now, proceed further */
> +#ifdef BACKLIGHT
> + np = of_parse_phandle(dev->of_node, "backlight", 0);
> + if (np) {
> + jdi->backlight = of_find_backlight_by_node(np);
> + of_node_put(np);
> +
> + if (!jdi->backlight)
> + return -EPROBE_DEFER;
> + }
> +#endif
> +
> + drm_panel_init(&jdi->base);
> + jdi->base.funcs = &jdi_panel_funcs;
> + jdi->base.dev = &jdi->dsi->dev;
> +
> + ret = drm_panel_add(&jdi->base);
> + if (ret < 0)
> + goto put_backlight;
> +
> + return 0;
> +
> +put_backlight:
> + if (jdi->backlight)
> + put_device(&jdi->backlight->dev);
> +
> + return ret;
> +}
> +
> +static void jdi_panel_del(struct jdi_panel *jdi)
> +{
> + if (jdi->base.dev)
> + drm_panel_remove(&jdi->base);
> +
> + if (jdi->backlight)
> + put_device(&jdi->backlight->dev);
> +}
> +
> +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_MODE_VIDEO_HFP | MIPI_DSI_MODE_VIDEO_HBP |
> + MIPI_DSI_MODE_VIDEO_HSA |
> + 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 <sumit.semwal@linaro.org>");
> +MODULE_AUTHOR("Vinay Simha BN <simhavcs@gmail.com>");
> +MODULE_DESCRIPTION("JDI WUXGA LT070ME05000 DSI video/command mode panel driver");
> +MODULE_LICENSE("GPL v2");
> --
> 2.1.2
>
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v2 1/4] dt-bindings: Add jdi panel vendor
2016-04-14 17:15 [RESEND][PATCH] " Rob Herring
@ 2016-04-20 9:32 ` Vinay Simha BN
2016-04-20 9:32 ` [PATCH v2 2/4] dt-bindings: Add jdi lt070me05000 panel bindings Vinay Simha BN
0 siblings, 1 reply; 11+ messages in thread
From: Vinay Simha BN @ 2016-04-20 9:32 UTC (permalink / raw)
Cc: Vinay Simha BN, Rob Herring, Pawel Moll, Mark Rutland,
Ian Campbell, Kumar Gala, Thierry Reding, Ralf Baechle,
Jonathan Cameron, Shawn Guo,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
open list
Japan Display Inc.
Signed-off-by: Vinay Simha BN <simhavcs@gmail.com>
---
Documentation/devicetree/bindings/vendor-prefixes.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt
index 0061d25..a9ae6c14 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
@@ -133,6 +133,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
--
2.1.2
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v2 2/4] dt-bindings: Add jdi lt070me05000 panel bindings
2016-04-20 9:32 ` [PATCH v2 1/4] dt-bindings: Add jdi panel vendor Vinay Simha BN
@ 2016-04-20 9:32 ` Vinay Simha BN
2016-04-21 15:45 ` Rob Herring
0 siblings, 1 reply; 11+ messages in thread
From: Vinay Simha BN @ 2016-04-20 9:32 UTC (permalink / raw)
Cc: Vinay Simha BN, Thierry Reding, Rob Herring, Pawel Moll,
Mark Rutland, Ian Campbell, Kumar Gala,
open list:DRM PANEL DRIVERS,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
open list
Add documentation for lt070me05000 panel
Signed-off-by: Vinay Simha BN <simhavcs@gmail.com>
---
.../bindings/display/panel/jdi,lt070me05000.txt | 43 ++++++++++++++++++++++
1 file changed, 43 insertions(+)
create mode 100644 Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
diff --git a/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt b/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
new file mode 100644
index 0000000..ffe0550
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
@@ -0,0 +1,43 @@
+JDI model LT070ME05000 1200x1920 7" DSI Panel
+
+Required properties:
+- compatible: should be "jdi,lt070me05000"
+- power-supply: phandle of the regulator that provides the supply voltage
+ IOVCC , power supply for LCM (1.8V)
+- vddp-supply: phandle of the regulator that provides the supply voltage
+ Power IC supply (3-5V)
+- dcdc_en-supply: phandle of the regulator that provides the supply voltage
+ Power IC supply enable, High active
+- reset-gpio: phandle of gpio for reset line
+ This should be 8mA, gpio can be configured using mux and pinctrl.
+ XRES, Reset, Low active
+- enable-gpio: phandle of gpio for enable line
+ LED_EN, LED backlight enable, High active
+- vcc-gpio: phandle of regulator/gpio that provides the supply voltage
+ VDD, LED power supply (3-5V)
+
+Optional properties:
+- pwm-gpio: phandle of gpio/pwm
+ pwm backlight control, this should be mapped to the backlight level
+ display brightness (0x51)
+
+Example:
+
+ dsi0: qcom,mdss_dsi@4700000 {
+ panel@0 {
+ compatible = "jdi,lt070me05000";
+ reg = <0>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&dsi_panel_pinctrl>;
+
+ power-supply = <&pm8921_lvs5>;
+ vddp-supply = <&pm8921_l17>;
+ dcdc_en-supply = <&pm8921_lvs7>;
+
+ reset-gpio = <&tlmm_pinmux 54 0>;
+ enable-gpio = <&pm8921_gpio 36 GPIO_ACTIVE_HIGH>;
+ vcc-gpio = <&pm8921_gpio 23 GPIO_ACTIVE_HIGH>;
+
+ pwm-gpio = <&pm8921_gpio 26 GPIO_ACTIVE_HIGH>;
+ };
+ };
--
2.1.2
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH v2 2/4] dt-bindings: Add jdi lt070me05000 panel bindings
2016-04-20 9:32 ` [PATCH v2 2/4] dt-bindings: Add jdi lt070me05000 panel bindings Vinay Simha BN
@ 2016-04-21 15:45 ` Rob Herring
2016-04-22 6:55 ` Vinay Simha
0 siblings, 1 reply; 11+ messages in thread
From: Rob Herring @ 2016-04-21 15:45 UTC (permalink / raw)
To: Vinay Simha BN
Cc: Thierry Reding, Pawel Moll, Mark Rutland, Ian Campbell,
Kumar Gala, open list:DRM PANEL DRIVERS,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
open list
On Wed, Apr 20, 2016 at 03:02:31PM +0530, Vinay Simha BN wrote:
> Add documentation for lt070me05000 panel
>
> Signed-off-by: Vinay Simha BN <simhavcs@gmail.com>
> ---
> .../bindings/display/panel/jdi,lt070me05000.txt | 43 ++++++++++++++++++++++
> 1 file changed, 43 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
>
> diff --git a/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt b/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
> new file mode 100644
> index 0000000..ffe0550
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
> @@ -0,0 +1,43 @@
> +JDI model LT070ME05000 1200x1920 7" DSI Panel
> +
> +Required properties:
> +- compatible: should be "jdi,lt070me05000"
> +- power-supply: phandle of the regulator that provides the supply voltage
> + IOVCC , power supply for LCM (1.8V)
> +- vddp-supply: phandle of the regulator that provides the supply voltage
> + Power IC supply (3-5V)
> +- dcdc_en-supply: phandle of the regulator that provides the supply voltage
> + Power IC supply enable, High active
> +- reset-gpio: phandle of gpio for reset line
> + This should be 8mA, gpio can be configured using mux and pinctrl.
> + XRES, Reset, Low active
> +- enable-gpio: phandle of gpio for enable line
> + LED_EN, LED backlight enable, High active
These should all be -gpios instead.
> +- vcc-gpio: phandle of regulator/gpio that provides the supply voltage
> + VDD, LED power supply (3-5V)
Is it a regulator or gpio?
> +
> +Optional properties:
> +- pwm-gpio: phandle of gpio/pwm
This should use the PWM binding. It may not be a GPIO on some hosts.
> + pwm backlight control, this should be mapped to the backlight level
> + display brightness (0x51)
> +
> +Example:
> +
> + dsi0: qcom,mdss_dsi@4700000 {
> + panel@0 {
> + compatible = "jdi,lt070me05000";
> + reg = <0>;
> + pinctrl-names = "default";
> + pinctrl-0 = <&dsi_panel_pinctrl>;
> +
> + power-supply = <&pm8921_lvs5>;
> + vddp-supply = <&pm8921_l17>;
> + dcdc_en-supply = <&pm8921_lvs7>;
> +
> + reset-gpio = <&tlmm_pinmux 54 0>;
> + enable-gpio = <&pm8921_gpio 36 GPIO_ACTIVE_HIGH>;
> + vcc-gpio = <&pm8921_gpio 23 GPIO_ACTIVE_HIGH>;
> +
> + pwm-gpio = <&pm8921_gpio 26 GPIO_ACTIVE_HIGH>;
> + };
> + };
> --
> 2.1.2
>
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH v2 2/4] dt-bindings: Add jdi lt070me05000 panel bindings
2016-04-21 15:45 ` Rob Herring
@ 2016-04-22 6:55 ` Vinay Simha
2016-04-22 11:59 ` Thierry Reding
0 siblings, 1 reply; 11+ messages in thread
From: Vinay Simha @ 2016-04-22 6:55 UTC (permalink / raw)
To: Rob Herring
Cc: Thierry Reding, Pawel Moll, Mark Rutland, Ian Campbell,
Kumar Gala, open list:DRM PANEL DRIVERS,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
open list, Sumit.semwal, John Stultz, Archit Taneja
On Thu, Apr 21, 2016 at 9:15 PM, Rob Herring <robh@kernel.org> wrote:
> On Wed, Apr 20, 2016 at 03:02:31PM +0530, Vinay Simha BN wrote:
>> Add documentation for lt070me05000 panel
>>
>> Signed-off-by: Vinay Simha BN <simhavcs@gmail.com>
>> ---
>> .../bindings/display/panel/jdi,lt070me05000.txt | 43 ++++++++++++++++++++++
>> 1 file changed, 43 insertions(+)
>> create mode 100644 Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
>>
>> diff --git a/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt b/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
>> new file mode 100644
>> index 0000000..ffe0550
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
>> @@ -0,0 +1,43 @@
>> +JDI model LT070ME05000 1200x1920 7" DSI Panel
>> +
>> +Required properties:
>> +- compatible: should be "jdi,lt070me05000"
>> +- power-supply: phandle of the regulator that provides the supply voltage
>> + IOVCC , power supply for LCM (1.8V)
>> +- vddp-supply: phandle of the regulator that provides the supply voltage
>> + Power IC supply (3-5V)
>> +- dcdc_en-supply: phandle of the regulator that provides the supply voltage
>> + Power IC supply enable, High active
>> +- reset-gpio: phandle of gpio for reset line
>> + This should be 8mA, gpio can be configured using mux and pinctrl.
>> + XRES, Reset, Low active
>> +- enable-gpio: phandle of gpio for enable line
>> + LED_EN, LED backlight enable, High active
>
> These should all be -gpios instead.
will implement in v3
>
>> +- vcc-gpio: phandle of regulator/gpio that provides the supply voltage
>> + VDD, LED power supply (3-5V)
>
> Is it a regulator or gpio?
>
VDD is LED power supply, but in nexus 7 2nd gen they are using gpio 23
instead of regulator.
if we use vcc-supply, not sure we can give the gpio device tree entry
to it in nexus 7 dts. Any inputs ?
>> +
>> +Optional properties:
>> +- pwm-gpio: phandle of gpio/pwm
>
> This should use the PWM binding. It may not be a GPIO on some hosts.
pwm-gpio will go to the backlight (pwm). right now it is not used
since pwm pm8921 upstream driver is not yet implemented. Shall i
remove this pwm-gpio now and the backlight property when pwm pm8921 is
implemented?
>
>> + pwm backlight control, this should be mapped to the backlight level
>> + display brightness (0x51)
>> +
>> +Example:
>> +
>> + dsi0: qcom,mdss_dsi@4700000 {
>> + panel@0 {
>> + compatible = "jdi,lt070me05000";
>> + reg = <0>;
>> + pinctrl-names = "default";
>> + pinctrl-0 = <&dsi_panel_pinctrl>;
>> +
>> + power-supply = <&pm8921_lvs5>;
>> + vddp-supply = <&pm8921_l17>;
>> + dcdc_en-supply = <&pm8921_lvs7>;
>> +
>> + reset-gpio = <&tlmm_pinmux 54 0>;
>> + enable-gpio = <&pm8921_gpio 36 GPIO_ACTIVE_HIGH>;
>> + vcc-gpio = <&pm8921_gpio 23 GPIO_ACTIVE_HIGH>;
>> +
>> + pwm-gpio = <&pm8921_gpio 26 GPIO_ACTIVE_HIGH>;
>> + };
>> + };
>> --
>> 2.1.2
>>
--
Regards,
Vinay Simha.B.N.
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH v2 2/4] dt-bindings: Add jdi lt070me05000 panel bindings
2016-04-22 6:55 ` Vinay Simha
@ 2016-04-22 11:59 ` Thierry Reding
0 siblings, 0 replies; 11+ messages in thread
From: Thierry Reding @ 2016-04-22 11:59 UTC (permalink / raw)
To: Vinay Simha
Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
open list:DRM PANEL DRIVERS,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
open list, Sumit.semwal, John Stultz, Archit Taneja
[-- Attachment #1: Type: text/plain, Size: 2871 bytes --]
On Fri, Apr 22, 2016 at 12:25:52PM +0530, Vinay Simha wrote:
> On Thu, Apr 21, 2016 at 9:15 PM, Rob Herring <robh@kernel.org> wrote:
> > On Wed, Apr 20, 2016 at 03:02:31PM +0530, Vinay Simha BN wrote:
> >> Add documentation for lt070me05000 panel
> >>
> >> Signed-off-by: Vinay Simha BN <simhavcs@gmail.com>
> >> ---
> >> .../bindings/display/panel/jdi,lt070me05000.txt | 43 ++++++++++++++++++++++
> >> 1 file changed, 43 insertions(+)
> >> create mode 100644 Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
> >>
> >> diff --git a/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt b/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
> >> new file mode 100644
> >> index 0000000..ffe0550
> >> --- /dev/null
> >> +++ b/Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.txt
> >> @@ -0,0 +1,43 @@
> >> +JDI model LT070ME05000 1200x1920 7" DSI Panel
> >> +
> >> +Required properties:
> >> +- compatible: should be "jdi,lt070me05000"
> >> +- power-supply: phandle of the regulator that provides the supply voltage
> >> + IOVCC , power supply for LCM (1.8V)
> >> +- vddp-supply: phandle of the regulator that provides the supply voltage
> >> + Power IC supply (3-5V)
> >> +- dcdc_en-supply: phandle of the regulator that provides the supply voltage
> >> + Power IC supply enable, High active
> >> +- reset-gpio: phandle of gpio for reset line
> >> + This should be 8mA, gpio can be configured using mux and pinctrl.
> >> + XRES, Reset, Low active
> >> +- enable-gpio: phandle of gpio for enable line
> >> + LED_EN, LED backlight enable, High active
> >
> > These should all be -gpios instead.
> will implement in v3
> >
> >> +- vcc-gpio: phandle of regulator/gpio that provides the supply voltage
> >> + VDD, LED power supply (3-5V)
> >
> > Is it a regulator or gpio?
> >
> VDD is LED power supply, but in nexus 7 2nd gen they are using gpio 23
> instead of regulator.
> if we use vcc-supply, not sure we can give the gpio device tree entry
> to it in nexus 7 dts. Any inputs ?
You can model it as a fixed regulator that's enabled by a GPIO. See:
Documentation/devicetree/bindings/regulator/fixed-regulator.txt
> >> +
> >> +Optional properties:
> >> +- pwm-gpio: phandle of gpio/pwm
> >
> > This should use the PWM binding. It may not be a GPIO on some hosts.
>
> pwm-gpio will go to the backlight (pwm). right now it is not used
> since pwm pm8921 upstream driver is not yet implemented. Shall i
> remove this pwm-gpio now and the backlight property when pwm pm8921 is
> implemented?
This suggests to me that you don't have a good idea yet what the final
binding would need to look like, so it might be better to get all the
dependencies in place first so that the binding can be validated to work
properly.
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2016-07-14 21:20 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-07-13 16:44 [PATCH 1/4] dt-bindings: Add Japan Display Inc vendor id Vinay Simha BN
2016-07-13 16:44 ` [PATCH v2 2/4] dt-bindings: Add jdi lt070me05000 panel bindings Vinay Simha BN
2016-07-13 16:44 ` [PATCH v2 3/4] drm/dsi: Implement dcs set/get display brightness Vinay Simha BN
2016-07-14 21:20 ` Emil Velikov
2016-07-13 16:44 ` [PATCH v8 4/4] drm/panel: Add JDI LT070ME05000 WUXGA DSI Panel Vinay Simha BN
2016-07-13 18:58 ` John Stultz
2016-07-14 21:18 ` Emil Velikov
-- strict thread matches above, loose matches on Subject: below --
2016-04-14 17:15 [RESEND][PATCH] " Rob Herring
2016-04-20 9:32 ` [PATCH v2 1/4] dt-bindings: Add jdi panel vendor Vinay Simha BN
2016-04-20 9:32 ` [PATCH v2 2/4] dt-bindings: Add jdi lt070me05000 panel bindings Vinay Simha BN
2016-04-21 15:45 ` Rob Herring
2016-04-22 6:55 ` Vinay Simha
2016-04-22 11:59 ` Thierry Reding
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome