All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] drm/i915/dsi: dcs backlight control
@ 2016-04-26 13:14 Jani Nikula
  2016-04-26 13:14 ` [PATCH 1/3] drm/i915: Parse LFP brightness control field in VBT Jani Nikula
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Jani Nikula @ 2016-04-26 13:14 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Next version of [1].

BR,
Jani.

[1] http://mid.gmane.org/1459346623-30752-1-git-send-email-jani.nikula@intel.com

Deepak M (2):
  drm/i915: Parse LFP brightness control field in VBT
  CABC support for Panel PWM backlight control

Jani Nikula (1):
  drm/i915: Add DCS control for Panel PWM

 drivers/gpu/drm/i915/Makefile                  |   1 +
 drivers/gpu/drm/i915/i915_drv.h                |   1 +
 drivers/gpu/drm/i915/intel_bios.c              |   9 ++
 drivers/gpu/drm/i915/intel_bios.h              |   8 ++
 drivers/gpu/drm/i915/intel_drv.h               |   2 +
 drivers/gpu/drm/i915/intel_dsi.c               |  36 ++++-
 drivers/gpu/drm/i915/intel_dsi.h               |   4 +
 drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c | 179 +++++++++++++++++++++++++
 drivers/gpu/drm/i915/intel_panel.c             |   4 +
 drivers/gpu/drm/i915/intel_vbt_defs.h          |   6 +
 10 files changed, 248 insertions(+), 2 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c

-- 
2.1.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/3] drm/i915: Parse LFP brightness control field in VBT
  2016-04-26 13:14 [PATCH 0/3] drm/i915/dsi: dcs backlight control Jani Nikula
@ 2016-04-26 13:14 ` Jani Nikula
  2016-05-02 13:46   ` Jani Nikula
  2016-04-26 13:14 ` [PATCH 2/3] drm/i915: Add DCS control for Panel PWM Jani Nikula
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 10+ messages in thread
From: Jani Nikula @ 2016-04-26 13:14 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula, Deepak M

From: Deepak M <m.deepak@intel.com>

These fields in VBT indicates the PWM source which
is used and also the controller number.

v2 by Jani: check for out of bounds access, some renames, change default
type, etc.

v3 by Jani: s/INTEL_BACKLIGHT_CABC/INTEL_BACKLIGHT_DSI_DCS/

Signed-off-by: Deepak M <m.deepak@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h       | 1 +
 drivers/gpu/drm/i915/intel_bios.c     | 9 +++++++++
 drivers/gpu/drm/i915/intel_bios.h     | 8 ++++++++
 drivers/gpu/drm/i915/intel_vbt_defs.h | 6 ++++++
 4 files changed, 24 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 32f05979ade7..f86dd10dabfe 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1488,6 +1488,7 @@ struct intel_vbt_data {
 		bool present;
 		bool active_low_pwm;
 		u8 min_brightness;	/* min_brightness/255 of max */
+		enum intel_backlight_type type;
 	} backlight;
 
 	/* MIPI DSI */
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
index dbbd59171722..81518116e00d 100644
--- a/drivers/gpu/drm/i915/intel_bios.c
+++ b/drivers/gpu/drm/i915/intel_bios.c
@@ -318,6 +318,15 @@ parse_lfp_backlight(struct drm_i915_private *dev_priv,
 		return;
 	}
 
+	dev_priv->vbt.backlight.type = INTEL_BACKLIGHT_DISPLAY_DDI;
+	if (bdb->version >= 191 &&
+	    get_blocksize(backlight_data) >= sizeof(*backlight_data)) {
+		const struct bdb_lfp_backlight_control_method *method;
+
+		method = &backlight_data->backlight_control[panel_type];
+		dev_priv->vbt.backlight.type = method->type;
+	}
+
 	dev_priv->vbt.backlight.pwm_freq_hz = entry->pwm_freq_hz;
 	dev_priv->vbt.backlight.active_low_pwm = entry->active_low_pwm;
 	dev_priv->vbt.backlight.min_brightness = entry->min_brightness;
diff --git a/drivers/gpu/drm/i915/intel_bios.h b/drivers/gpu/drm/i915/intel_bios.h
index 149c3226e895..8405b5a367d7 100644
--- a/drivers/gpu/drm/i915/intel_bios.h
+++ b/drivers/gpu/drm/i915/intel_bios.h
@@ -30,6 +30,14 @@
 #ifndef _INTEL_BIOS_H_
 #define _INTEL_BIOS_H_
 
+enum intel_backlight_type {
+	INTEL_BACKLIGHT_PMIC,
+	INTEL_BACKLIGHT_LPSS,
+	INTEL_BACKLIGHT_DISPLAY_DDI,
+	INTEL_BACKLIGHT_DSI_DCS,
+	INTEL_BACKLIGHT_PANEL_DRIVER_INTERFACE,
+};
+
 struct edp_power_seq {
 	u16 t1_t3;
 	u16 t8;
diff --git a/drivers/gpu/drm/i915/intel_vbt_defs.h b/drivers/gpu/drm/i915/intel_vbt_defs.h
index 9ff1e960d617..a4a42f254c35 100644
--- a/drivers/gpu/drm/i915/intel_vbt_defs.h
+++ b/drivers/gpu/drm/i915/intel_vbt_defs.h
@@ -446,10 +446,16 @@ struct bdb_lfp_backlight_data_entry {
 	u8 obsolete3;
 } __packed;
 
+struct bdb_lfp_backlight_control_method {
+	u8 type:4;
+	u8 controller:4;
+} __packed;
+
 struct bdb_lfp_backlight_data {
 	u8 entry_size;
 	struct bdb_lfp_backlight_data_entry data[16];
 	u8 level[16];
+	struct bdb_lfp_backlight_control_method backlight_control[16];
 } __packed;
 
 struct aimdb_header {
-- 
2.1.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/3] drm/i915: Add DCS control for Panel PWM
  2016-04-26 13:14 [PATCH 0/3] drm/i915/dsi: dcs backlight control Jani Nikula
  2016-04-26 13:14 ` [PATCH 1/3] drm/i915: Parse LFP brightness control field in VBT Jani Nikula
@ 2016-04-26 13:14 ` Jani Nikula
  2016-04-26 14:14   ` kbuild test robot
  2016-04-26 14:57   ` Adebisi, YetundeX
  2016-04-26 13:14 ` [PATCH 3/3] CABC support for Panel PWM backlight control Jani Nikula
  2016-04-26 16:55 ` ✗ Fi.CI.BAT: warning for drm/i915/dsi: dcs " Patchwork
  3 siblings, 2 replies; 10+ messages in thread
From: Jani Nikula @ 2016-04-26 13:14 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula, Daniel Vetter, Deepak M, Yetunde Adebisi

If the source of the backlight PWM is from the
panel then the PWM can be controlled by DCS
command, this patch adds the support to
enable/disbale panel PWM, control backlight level
etc...

v2: Moving the CABC bkl functions to new file.(Jani)

v3: Rebase

v4: Rebase

v5: Use mipi_dsi_dcs_write() instead of mipi_dsi_dcs_write_buffer() (Jani)
    Move DCS macro`s to include/video/mipi_display.h (Jani)

v6: Rename the file to intel_dsi_panel_pwm.c
    Removing the CABC operations

v7 by Jani: renames, rebases, etc.

v8 by Jani: s/INTEL_BACKLIGHT_CABC/INTEL_BACKLIGHT_DSI_DCS/

v9 by Jani: rename init function to intel_dsi_dcs_init_backlight_funcs

Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Daniel Vetter <daniel.vetter@intel.com>
Cc: Yetunde Adebisi <yetundex.adebisi@intel.com>
Signed-off-by: Deepak M <m.deepak@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/Makefile                  |   1 +
 drivers/gpu/drm/i915/intel_drv.h               |   2 +
 drivers/gpu/drm/i915/intel_dsi.c               |  19 ++-
 drivers/gpu/drm/i915/intel_dsi.h               |   3 +
 drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c | 157 +++++++++++++++++++++++++
 drivers/gpu/drm/i915/intel_panel.c             |   4 +
 6 files changed, 184 insertions(+), 2 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 723c50251127..b5ec800f953e 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -86,6 +86,7 @@ i915-y += dvo_ch7017.o \
 	  intel_dp_mst.o \
 	  intel_dp.o \
 	  intel_dsi.o \
+	  intel_dsi_dcs_backlight.o \
 	  intel_dsi_panel_vbt.o \
 	  intel_dsi_pll.o \
 	  intel_dvo.o \
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index cb89a35a6755..d65dfbb8cf7d 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1346,6 +1346,8 @@ void intel_dp_mst_encoder_cleanup(struct intel_digital_port *intel_dig_port);
 /* intel_dsi.c */
 void intel_dsi_init(struct drm_device *dev);
 
+/* intel_dsi_dcs_backlight.c */
+int intel_dsi_dcs_init_backlight_funcs(struct intel_connector *intel_connector);
 
 /* intel_dvo.c */
 void intel_dvo_init(struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index 2b22bb9bb86f..2209f9fe6c4b 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -1364,10 +1364,25 @@ void intel_dsi_init(struct drm_device *dev)
 	else
 		intel_encoder->crtc_mask = BIT(PIPE_B);
 
-	if (dev_priv->vbt.dsi.config->dual_link)
+	if (dev_priv->vbt.dsi.config->dual_link) {
 		intel_dsi->ports = BIT(PORT_A) | BIT(PORT_C);
-	else
+
+		switch (dev_priv->vbt.dsi.config->dl_dcs_backlight_ports) {
+		case DL_DCS_PORT_A:
+			intel_dsi->dcs_backlight_ports = BIT(PORT_A);
+			break;
+		case DL_DCS_PORT_C:
+			intel_dsi->dcs_backlight_ports = BIT(PORT_C);
+			break;
+		default:
+		case DL_DCS_PORT_A_AND_C:
+			intel_dsi->dcs_backlight_ports = BIT(PORT_A) | BIT(PORT_C);
+			break;
+		}
+	} else {
 		intel_dsi->ports = BIT(port);
+		intel_dsi->dcs_backlight_ports = BIT(port);
+	}
 
 	/* Create a DSI host (and a device) for each port. */
 	for_each_dsi_port(port, intel_dsi->ports) {
diff --git a/drivers/gpu/drm/i915/intel_dsi.h b/drivers/gpu/drm/i915/intel_dsi.h
index 61a6957fc6c2..b00fb3fbb0b1 100644
--- a/drivers/gpu/drm/i915/intel_dsi.h
+++ b/drivers/gpu/drm/i915/intel_dsi.h
@@ -78,6 +78,9 @@ struct intel_dsi {
 
 	u8 escape_clk_div;
 	u8 dual_link;
+
+	u16 dcs_backlight_ports;
+
 	u8 pixel_overlap;
 	u32 port_bits;
 	u32 bw_timer;
diff --git a/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
new file mode 100644
index 000000000000..7f9bbffa7f8c
--- /dev/null
+++ b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
@@ -0,0 +1,157 @@
+/*
+ * Copyright © 2016 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Deepak M <m.deepak at intel.com>
+ */
+
+#include "intel_drv.h"
+#include "intel_dsi.h"
+#include "i915_drv.h"
+#include <video/mipi_display.h>
+#include <drm/drm_mipi_dsi.h>
+
+#define CONTROL_DISPLAY_BCTRL		(1 << 5)
+#define CONTROL_DISPLAY_DD		(1 << 3)
+#define CONTROL_DISPLAY_BL		(1 << 2)
+
+#define PANEL_PWM_MAX_VALUE		0xFF
+
+static u32 dcs_get_backlight(struct intel_connector *connector)
+{
+	struct intel_encoder *encoder = connector->encoder;
+	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+	struct mipi_dsi_device *dsi_device;
+	u8 data;
+	enum port port;
+
+	/* FIXME: Need to take care of 16 bit brightness level */
+	for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
+		dsi_device = intel_dsi->dsi_hosts[port]->device;
+		mipi_dsi_dcs_read(dsi_device, MIPI_DCS_GET_DISPLAY_BRIGHTNESS,
+				  &data, sizeof(data));
+		break;
+	}
+
+	return data;
+}
+
+static void dcs_set_backlight(struct intel_connector *connector, u32 level)
+{
+	struct intel_encoder *encoder = connector->encoder;
+	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+	struct mipi_dsi_device *dsi_device;
+	u8 data = level;
+	enum port port;
+
+	/* FIXME: Need to take care of 16 bit brightness level */
+	for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
+		dsi_device = intel_dsi->dsi_hosts[port]->device;
+		mipi_dsi_dcs_write(dsi_device, MIPI_DCS_SET_DISPLAY_BRIGHTNESS,
+				   &data, sizeof(data));
+	}
+}
+
+static void dcs_disable_backlight(struct intel_connector *connector)
+{
+	struct intel_encoder *encoder = connector->encoder;
+	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+	struct mipi_dsi_device *dsi_device;
+	enum port port;
+
+	dcs_set_backlight(connector, 0);
+
+	for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
+		u8 ctrl = 0;
+
+		dsi_device = intel_dsi->dsi_hosts[port]->device;
+
+		mipi_dsi_dcs_read(dsi_device, MIPI_DCS_GET_CONTROL_DISPLAY,
+				  &ctrl, sizeof(ctrl));
+
+		ctrl &= ~CONTROL_DISPLAY_BL;
+		ctrl &= ~CONTROL_DISPLAY_DD;
+		ctrl &= ~CONTROL_DISPLAY_BCTRL;
+
+		mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_CONTROL_DISPLAY,
+				   &ctrl, sizeof(ctrl));
+	}
+}
+
+static void dcs_enable_backlight(struct intel_connector *connector)
+{
+	struct intel_encoder *encoder = connector->encoder;
+	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+	struct intel_panel *panel = &connector->panel;
+	struct mipi_dsi_device *dsi_device;
+	enum port port;
+
+	for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
+		u8 ctrl = 0;
+
+		dsi_device = intel_dsi->dsi_hosts[port]->device;
+
+		mipi_dsi_dcs_read(dsi_device, MIPI_DCS_GET_CONTROL_DISPLAY,
+				  &ctrl, sizeof(ctrl));
+
+		ctrl |= CONTROL_DISPLAY_BL;
+		ctrl |= CONTROL_DISPLAY_DD;
+		ctrl |= CONTROL_DISPLAY_BCTRL;
+
+		mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_CONTROL_DISPLAY,
+				   &ctrl, sizeof(ctrl));
+	}
+
+	dcs_set_backlight(connector, panel->backlight.level);
+}
+
+static int dcs_setup_backlight(struct intel_connector *connector,
+			       enum pipe unused)
+{
+	struct intel_panel *panel = &connector->panel;
+
+	panel->backlight.max = PANEL_PWM_MAX_VALUE;
+	panel->backlight.level = PANEL_PWM_MAX_VALUE;
+
+	return 0;
+}
+
+int intel_dsi_dcs_init_backlight_funcs(struct intel_connector *intel_connector)
+{
+	struct drm_device *dev = intel_connector->base.dev;
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	struct intel_encoder *encoder = intel_connector->encoder;
+	struct intel_panel *panel = &intel_connector->panel;
+
+	if (dev_priv->vbt.backlight.type != INTEL_BACKLIGHT_DSI_DCS)
+		return -ENODEV;
+
+	if (WARN_ON(encoder->type != INTEL_OUTPUT_DSI))
+		return -EINVAL;
+
+	panel->backlight.setup = dcs_setup_backlight;
+	panel->backlight.enable = dcs_enable_backlight;
+	panel->backlight.disable = dcs_disable_backlight;
+	panel->backlight.set = dcs_set_backlight;
+	panel->backlight.get = dcs_get_backlight;
+
+	return 0;
+}
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index 828f0fcaaaf8..efaee7a7f933 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -1722,6 +1722,10 @@ intel_panel_init_backlight_funcs(struct intel_panel *panel)
 	    intel_dp_aux_init_backlight_funcs(connector) == 0)
 		return;
 
+	if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI &&
+	    intel_dsi_dcs_init_backlight_funcs(connector) == 0)
+		return;
+
 	if (IS_BROXTON(dev_priv)) {
 		panel->backlight.setup = bxt_setup_backlight;
 		panel->backlight.enable = bxt_enable_backlight;
-- 
2.1.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/3] CABC support for Panel PWM backlight control
  2016-04-26 13:14 [PATCH 0/3] drm/i915/dsi: dcs backlight control Jani Nikula
  2016-04-26 13:14 ` [PATCH 1/3] drm/i915: Parse LFP brightness control field in VBT Jani Nikula
  2016-04-26 13:14 ` [PATCH 2/3] drm/i915: Add DCS control for Panel PWM Jani Nikula
@ 2016-04-26 13:14 ` Jani Nikula
  2016-04-26 14:23   ` kbuild test robot
  2016-04-26 16:55 ` ✗ Fi.CI.BAT: warning for drm/i915/dsi: dcs " Patchwork
  3 siblings, 1 reply; 10+ messages in thread
From: Jani Nikula @ 2016-04-26 13:14 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula, Deepak M

From: Deepak M <m.deepak@intel.com>

In CABC (Content Adaptive Brightness Control) content grey level
scale can be increased while simultaneously decreasing
brightness of the backlight to achieve same perceived brightness.

The CABC is not standardized and panel vendors are free to follow
their implementation. The CABC implementaion here assumes that the
panels use standard SW register for control.

CABC is supported only when the PWM source for backlight is
from the panel.

v2 by Jani: rebase, renames, check cabc support earlier, etc.

Signed-off-by: Deepak M <m.deepak@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/intel_dsi.c               | 17 +++++++++++++++++
 drivers/gpu/drm/i915/intel_dsi.h               |  1 +
 drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c | 22 ++++++++++++++++++++++
 3 files changed, 40 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index 2209f9fe6c4b..a2306737bc57 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -1379,11 +1379,28 @@ void intel_dsi_init(struct drm_device *dev)
 			intel_dsi->dcs_backlight_ports = BIT(PORT_A) | BIT(PORT_C);
 			break;
 		}
+
+		switch (dev_priv->vbt.dsi.config->dl_dcs_cabc_ports) {
+		case DL_DCS_PORT_A:
+			intel_dsi->dcs_cabc_ports = BIT(PORT_A);
+			break;
+		case DL_DCS_PORT_C:
+			intel_dsi->dcs_cabc_ports = BIT(PORT_C);
+			break;
+		default:
+		case DL_DCS_PORT_A_AND_C:
+			intel_dsi->dcs_cabc_ports = BIT(PORT_A) | BIT(PORT_C);
+			break;
+		}
 	} else {
 		intel_dsi->ports = BIT(port);
 		intel_dsi->dcs_backlight_ports = BIT(port);
+		intel_dsi->dcs_cabc_ports = BIT(port);
 	}
 
+	if (!dev_priv->vbt.dsi.config->cabc_supported)
+		intel_dsi->dcs_cabc_ports = 0;
+
 	/* Create a DSI host (and a device) for each port. */
 	for_each_dsi_port(port, intel_dsi->ports) {
 		struct intel_dsi_host *host;
diff --git a/drivers/gpu/drm/i915/intel_dsi.h b/drivers/gpu/drm/i915/intel_dsi.h
index b00fb3fbb0b1..5967ea6d6045 100644
--- a/drivers/gpu/drm/i915/intel_dsi.h
+++ b/drivers/gpu/drm/i915/intel_dsi.h
@@ -80,6 +80,7 @@ struct intel_dsi {
 	u8 dual_link;
 
 	u16 dcs_backlight_ports;
+	u16 dcs_cabc_ports;
 
 	u8 pixel_overlap;
 	u32 port_bits;
diff --git a/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
index 7f9bbffa7f8c..f0dc427743f8 100644
--- a/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
+++ b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
@@ -33,6 +33,12 @@
 #define CONTROL_DISPLAY_DD		(1 << 3)
 #define CONTROL_DISPLAY_BL		(1 << 2)
 
+#define POWER_SAVE_OFF			(0 << 0)
+#define POWER_SAVE_LOW			(1 << 0)
+#define POWER_SAVE_MEDIUM		(2 << 0)
+#define POWER_SAVE_HIGH			(3 << 0)
+#define POWER_SAVE_OUTDOOR_MODE		(4 << 0)
+
 #define PANEL_PWM_MAX_VALUE		0xFF
 
 static u32 dcs_get_backlight(struct intel_connector *connector)
@@ -79,6 +85,14 @@ static void dcs_disable_backlight(struct intel_connector *connector)
 
 	dcs_set_backlight(connector, 0);
 
+	for_each_dsi_port(port, intel_dsi->dcs_cabc_ports) {
+		u8 cabc = POWER_SAVE_OFF;
+
+		dsi_device = intel_dsi->dsi_hosts[port]->device;
+		mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_POWER_SAVE,
+				   &cabc, sizeof(cabc));
+	}
+
 	for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
 		u8 ctrl = 0;
 
@@ -120,6 +134,14 @@ static void dcs_enable_backlight(struct intel_connector *connector)
 				   &ctrl, sizeof(ctrl));
 	}
 
+	for_each_dsi_port(port, intel_dsi->dcs_cabc_ports) {
+		u8 cabc = POWER_SAVE_MEDIUM;
+
+		dsi_device = intel_dsi->dsi_hosts[port]->device;
+		mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_POWER_SAVE,
+				   &cabc, sizeof(cabc));
+	}
+
 	dcs_set_backlight(connector, panel->backlight.level);
 }
 
-- 
2.1.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/3] drm/i915: Add DCS control for Panel PWM
  2016-04-26 13:14 ` [PATCH 2/3] drm/i915: Add DCS control for Panel PWM Jani Nikula
@ 2016-04-26 14:14   ` kbuild test robot
  2016-04-26 14:57   ` Adebisi, YetundeX
  1 sibling, 0 replies; 10+ messages in thread
From: kbuild test robot @ 2016-04-26 14:14 UTC (permalink / raw)
  Cc: Deepak M, jani.nikula, intel-gfx, Yetunde Adebisi, kbuild-all,
	Daniel Vetter

[-- Attachment #1: Type: text/plain, Size: 4711 bytes --]

Hi,

[auto build test ERROR on drm-intel/for-linux-next]
[cannot apply to v4.6-rc5 next-20160426]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Jani-Nikula/drm-i915-dsi-dcs-backlight-control/20160426-211653
base:   git://anongit.freedesktop.org/drm-intel for-linux-next
config: i386-randconfig-s0-201617 (attached as .config)
compiler: 
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c: In function 'dcs_get_backlight':
>> drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:49:33: error: 'MIPI_DCS_GET_DISPLAY_BRIGHTNESS' undeclared (first use in this function)
      mipi_dsi_dcs_read(dsi_device, MIPI_DCS_GET_DISPLAY_BRIGHTNESS,
                                    ^
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:49:33: note: each undeclared identifier is reported only once for each function it appears in
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c: In function 'dcs_set_backlight':
>> drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:68:34: error: 'MIPI_DCS_SET_DISPLAY_BRIGHTNESS' undeclared (first use in this function)
      mipi_dsi_dcs_write(dsi_device, MIPI_DCS_SET_DISPLAY_BRIGHTNESS,
                                     ^
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c: In function 'dcs_disable_backlight':
>> drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:87:33: error: 'MIPI_DCS_GET_CONTROL_DISPLAY' undeclared (first use in this function)
      mipi_dsi_dcs_read(dsi_device, MIPI_DCS_GET_CONTROL_DISPLAY,
                                    ^
>> drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:94:34: error: 'MIPI_DCS_WRITE_CONTROL_DISPLAY' undeclared (first use in this function)
      mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_CONTROL_DISPLAY,
                                     ^
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c: In function 'dcs_enable_backlight':
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:112:33: error: 'MIPI_DCS_GET_CONTROL_DISPLAY' undeclared (first use in this function)
      mipi_dsi_dcs_read(dsi_device, MIPI_DCS_GET_CONTROL_DISPLAY,
                                    ^
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:119:34: error: 'MIPI_DCS_WRITE_CONTROL_DISPLAY' undeclared (first use in this function)
      mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_CONTROL_DISPLAY,
                                     ^

vim +/MIPI_DCS_GET_DISPLAY_BRIGHTNESS +49 drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c

    43		u8 data;
    44		enum port port;
    45	
    46		/* FIXME: Need to take care of 16 bit brightness level */
    47		for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
    48			dsi_device = intel_dsi->dsi_hosts[port]->device;
  > 49			mipi_dsi_dcs_read(dsi_device, MIPI_DCS_GET_DISPLAY_BRIGHTNESS,
    50					  &data, sizeof(data));
    51			break;
    52		}
    53	
    54		return data;
    55	}
    56	
    57	static void dcs_set_backlight(struct intel_connector *connector, u32 level)
    58	{
    59		struct intel_encoder *encoder = connector->encoder;
    60		struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
    61		struct mipi_dsi_device *dsi_device;
    62		u8 data = level;
    63		enum port port;
    64	
    65		/* FIXME: Need to take care of 16 bit brightness level */
    66		for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
    67			dsi_device = intel_dsi->dsi_hosts[port]->device;
  > 68			mipi_dsi_dcs_write(dsi_device, MIPI_DCS_SET_DISPLAY_BRIGHTNESS,
    69					   &data, sizeof(data));
    70		}
    71	}
    72	
    73	static void dcs_disable_backlight(struct intel_connector *connector)
    74	{
    75		struct intel_encoder *encoder = connector->encoder;
    76		struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
    77		struct mipi_dsi_device *dsi_device;
    78		enum port port;
    79	
    80		dcs_set_backlight(connector, 0);
    81	
    82		for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
    83			u8 ctrl = 0;
    84	
    85			dsi_device = intel_dsi->dsi_hosts[port]->device;
    86	
  > 87			mipi_dsi_dcs_read(dsi_device, MIPI_DCS_GET_CONTROL_DISPLAY,
    88					  &ctrl, sizeof(ctrl));
    89	
    90			ctrl &= ~CONTROL_DISPLAY_BL;
    91			ctrl &= ~CONTROL_DISPLAY_DD;
    92			ctrl &= ~CONTROL_DISPLAY_BCTRL;
    93	
  > 94			mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_CONTROL_DISPLAY,
    95					   &ctrl, sizeof(ctrl));
    96		}
    97	}

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 31074 bytes --]

[-- Attachment #3: Type: text/plain, Size: 160 bytes --]

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/3] CABC support for Panel PWM backlight control
  2016-04-26 13:14 ` [PATCH 3/3] CABC support for Panel PWM backlight control Jani Nikula
@ 2016-04-26 14:23   ` kbuild test robot
  0 siblings, 0 replies; 10+ messages in thread
From: kbuild test robot @ 2016-04-26 14:23 UTC (permalink / raw)
  Cc: jani.nikula, Deepak M, intel-gfx, kbuild-all

[-- Attachment #1: Type: text/plain, Size: 4935 bytes --]

Hi,

[auto build test ERROR on drm-intel/for-linux-next]
[cannot apply to v4.6-rc5 next-20160426]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Jani-Nikula/drm-i915-dsi-dcs-backlight-control/20160426-211653
base:   git://anongit.freedesktop.org/drm-intel for-linux-next
config: i386-randconfig-s0-201617 (attached as .config)
compiler: 
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c: In function 'dcs_get_backlight':
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:55:33: error: 'MIPI_DCS_GET_DISPLAY_BRIGHTNESS' undeclared (first use in this function)
      mipi_dsi_dcs_read(dsi_device, MIPI_DCS_GET_DISPLAY_BRIGHTNESS,
                                    ^
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:55:33: note: each undeclared identifier is reported only once for each function it appears in
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c: In function 'dcs_set_backlight':
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:74:34: error: 'MIPI_DCS_SET_DISPLAY_BRIGHTNESS' undeclared (first use in this function)
      mipi_dsi_dcs_write(dsi_device, MIPI_DCS_SET_DISPLAY_BRIGHTNESS,
                                     ^
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c: In function 'dcs_disable_backlight':
>> drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:92:34: error: 'MIPI_DCS_WRITE_POWER_SAVE' undeclared (first use in this function)
      mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_POWER_SAVE,
                                     ^
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:101:33: error: 'MIPI_DCS_GET_CONTROL_DISPLAY' undeclared (first use in this function)
      mipi_dsi_dcs_read(dsi_device, MIPI_DCS_GET_CONTROL_DISPLAY,
                                    ^
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:108:34: error: 'MIPI_DCS_WRITE_CONTROL_DISPLAY' undeclared (first use in this function)
      mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_CONTROL_DISPLAY,
                                     ^
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c: In function 'dcs_enable_backlight':
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:126:33: error: 'MIPI_DCS_GET_CONTROL_DISPLAY' undeclared (first use in this function)
      mipi_dsi_dcs_read(dsi_device, MIPI_DCS_GET_CONTROL_DISPLAY,
                                    ^
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:133:34: error: 'MIPI_DCS_WRITE_CONTROL_DISPLAY' undeclared (first use in this function)
      mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_CONTROL_DISPLAY,
                                     ^
   drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c:141:34: error: 'MIPI_DCS_WRITE_POWER_SAVE' undeclared (first use in this function)
      mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_POWER_SAVE,
                                     ^

vim +/MIPI_DCS_WRITE_POWER_SAVE +92 drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c

    49		u8 data;
    50		enum port port;
    51	
    52		/* FIXME: Need to take care of 16 bit brightness level */
    53		for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
    54			dsi_device = intel_dsi->dsi_hosts[port]->device;
  > 55			mipi_dsi_dcs_read(dsi_device, MIPI_DCS_GET_DISPLAY_BRIGHTNESS,
    56					  &data, sizeof(data));
    57			break;
    58		}
    59	
    60		return data;
    61	}
    62	
    63	static void dcs_set_backlight(struct intel_connector *connector, u32 level)
    64	{
    65		struct intel_encoder *encoder = connector->encoder;
    66		struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
    67		struct mipi_dsi_device *dsi_device;
    68		u8 data = level;
    69		enum port port;
    70	
    71		/* FIXME: Need to take care of 16 bit brightness level */
    72		for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
    73			dsi_device = intel_dsi->dsi_hosts[port]->device;
    74			mipi_dsi_dcs_write(dsi_device, MIPI_DCS_SET_DISPLAY_BRIGHTNESS,
    75					   &data, sizeof(data));
    76		}
    77	}
    78	
    79	static void dcs_disable_backlight(struct intel_connector *connector)
    80	{
    81		struct intel_encoder *encoder = connector->encoder;
    82		struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
    83		struct mipi_dsi_device *dsi_device;
    84		enum port port;
    85	
    86		dcs_set_backlight(connector, 0);
    87	
    88		for_each_dsi_port(port, intel_dsi->dcs_cabc_ports) {
    89			u8 cabc = POWER_SAVE_OFF;
    90	
    91			dsi_device = intel_dsi->dsi_hosts[port]->device;
  > 92			mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_POWER_SAVE,
    93					   &cabc, sizeof(cabc));
    94		}
    95	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 31074 bytes --]

[-- Attachment #3: Type: text/plain, Size: 160 bytes --]

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/3] drm/i915: Add DCS control for Panel PWM
  2016-04-26 13:14 ` [PATCH 2/3] drm/i915: Add DCS control for Panel PWM Jani Nikula
  2016-04-26 14:14   ` kbuild test robot
@ 2016-04-26 14:57   ` Adebisi, YetundeX
  2016-05-17 14:01     ` Jani Nikula
  1 sibling, 1 reply; 10+ messages in thread
From: Adebisi, YetundeX @ 2016-04-26 14:57 UTC (permalink / raw)
  To: Nikula, Jani, intel-gfx; +Cc: Deepak, M, Vetter, Daniel



> -----Original Message-----
> From: Nikula, Jani
> Sent: Tuesday, April 26, 2016 2:14 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: Nikula, Jani; Vetter, Daniel; Adebisi, YetundeX; Deepak, M
> Subject: [PATCH 2/3] drm/i915: Add DCS control for Panel PWM
> 
> If the source of the backlight PWM is from the
> panel then the PWM can be controlled by DCS
> command, this patch adds the support to
> enable/disbale panel PWM, control backlight level
> etc...
> 
> v2: Moving the CABC bkl functions to new file.(Jani)
> 
> v3: Rebase
> 
> v4: Rebase
> 
> v5: Use mipi_dsi_dcs_write() instead of mipi_dsi_dcs_write_buffer() (Jani)
>     Move DCS macro`s to include/video/mipi_display.h (Jani)
> 
> v6: Rename the file to intel_dsi_panel_pwm.c
>     Removing the CABC operations
> 
> v7 by Jani: renames, rebases, etc.
> 
> v8 by Jani: s/INTEL_BACKLIGHT_CABC/INTEL_BACKLIGHT_DSI_DCS/
> 
> v9 by Jani: rename init function to intel_dsi_dcs_init_backlight_funcs
> 
> Cc: Jani Nikula <jani.nikula@intel.com>
> Cc: Daniel Vetter <daniel.vetter@intel.com>
> Cc: Yetunde Adebisi <yetundex.adebisi@intel.com>
> Signed-off-by: Deepak M <m.deepak@intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>

Reviewed-by: Yetunde Adebisi <yetundex.adebisi@intel.com>
> ---
>  drivers/gpu/drm/i915/Makefile                  |   1 +
>  drivers/gpu/drm/i915/intel_drv.h               |   2 +
>  drivers/gpu/drm/i915/intel_dsi.c               |  19 ++-
>  drivers/gpu/drm/i915/intel_dsi.h               |   3 +
>  drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c | 157
> +++++++++++++++++++++++++
>  drivers/gpu/drm/i915/intel_panel.c             |   4 +
>  6 files changed, 184 insertions(+), 2 deletions(-)
>  create mode 100644 drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
> 
> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
> index 723c50251127..b5ec800f953e 100644
> --- a/drivers/gpu/drm/i915/Makefile
> +++ b/drivers/gpu/drm/i915/Makefile
> @@ -86,6 +86,7 @@ i915-y += dvo_ch7017.o \
>  	  intel_dp_mst.o \
>  	  intel_dp.o \
>  	  intel_dsi.o \
> +	  intel_dsi_dcs_backlight.o \
>  	  intel_dsi_panel_vbt.o \
>  	  intel_dsi_pll.o \
>  	  intel_dvo.o \
> diff --git a/drivers/gpu/drm/i915/intel_drv.h
> b/drivers/gpu/drm/i915/intel_drv.h
> index cb89a35a6755..d65dfbb8cf7d 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -1346,6 +1346,8 @@ void intel_dp_mst_encoder_cleanup(struct
> intel_digital_port *intel_dig_port);
>  /* intel_dsi.c */
>  void intel_dsi_init(struct drm_device *dev);
> 
> +/* intel_dsi_dcs_backlight.c */
> +int intel_dsi_dcs_init_backlight_funcs(struct intel_connector
> *intel_connector);
> 
>  /* intel_dvo.c */
>  void intel_dvo_init(struct drm_device *dev);
> diff --git a/drivers/gpu/drm/i915/intel_dsi.c
> b/drivers/gpu/drm/i915/intel_dsi.c
> index 2b22bb9bb86f..2209f9fe6c4b 100644
> --- a/drivers/gpu/drm/i915/intel_dsi.c
> +++ b/drivers/gpu/drm/i915/intel_dsi.c
> @@ -1364,10 +1364,25 @@ void intel_dsi_init(struct drm_device *dev)
>  	else
>  		intel_encoder->crtc_mask = BIT(PIPE_B);
> 
> -	if (dev_priv->vbt.dsi.config->dual_link)
> +	if (dev_priv->vbt.dsi.config->dual_link) {
>  		intel_dsi->ports = BIT(PORT_A) | BIT(PORT_C);
> -	else
> +
> +		switch (dev_priv->vbt.dsi.config->dl_dcs_backlight_ports) {
> +		case DL_DCS_PORT_A:
> +			intel_dsi->dcs_backlight_ports = BIT(PORT_A);
> +			break;
> +		case DL_DCS_PORT_C:
> +			intel_dsi->dcs_backlight_ports = BIT(PORT_C);
> +			break;
> +		default:
> +		case DL_DCS_PORT_A_AND_C:
> +			intel_dsi->dcs_backlight_ports = BIT(PORT_A) |
> BIT(PORT_C);
> +			break;
> +		}
> +	} else {
>  		intel_dsi->ports = BIT(port);
> +		intel_dsi->dcs_backlight_ports = BIT(port);
> +	}
> 
>  	/* Create a DSI host (and a device) for each port. */
>  	for_each_dsi_port(port, intel_dsi->ports) {
> diff --git a/drivers/gpu/drm/i915/intel_dsi.h
> b/drivers/gpu/drm/i915/intel_dsi.h
> index 61a6957fc6c2..b00fb3fbb0b1 100644
> --- a/drivers/gpu/drm/i915/intel_dsi.h
> +++ b/drivers/gpu/drm/i915/intel_dsi.h
> @@ -78,6 +78,9 @@ struct intel_dsi {
> 
>  	u8 escape_clk_div;
>  	u8 dual_link;
> +
> +	u16 dcs_backlight_ports;
> +
>  	u8 pixel_overlap;
>  	u32 port_bits;
>  	u32 bw_timer;
> diff --git a/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
> b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
> new file mode 100644
> index 000000000000..7f9bbffa7f8c
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
> @@ -0,0 +1,157 @@
> +/*
> + * Copyright © 2016 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the
> "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO
> EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
> DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> OTHER
> + * DEALINGS IN THE SOFTWARE.
> + *
> + * Author: Deepak M <m.deepak at intel.com>
> + */
> +
> +#include "intel_drv.h"
> +#include "intel_dsi.h"
> +#include "i915_drv.h"
> +#include <video/mipi_display.h>
> +#include <drm/drm_mipi_dsi.h>
> +
> +#define CONTROL_DISPLAY_BCTRL		(1 << 5)
> +#define CONTROL_DISPLAY_DD		(1 << 3)
> +#define CONTROL_DISPLAY_BL		(1 << 2)
> +
> +#define PANEL_PWM_MAX_VALUE		0xFF
> +
> +static u32 dcs_get_backlight(struct intel_connector *connector)
> +{
> +	struct intel_encoder *encoder = connector->encoder;
> +	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
> +	struct mipi_dsi_device *dsi_device;
> +	u8 data;
> +	enum port port;
> +
> +	/* FIXME: Need to take care of 16 bit brightness level */
> +	for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
> +		dsi_device = intel_dsi->dsi_hosts[port]->device;
> +		mipi_dsi_dcs_read(dsi_device,
> MIPI_DCS_GET_DISPLAY_BRIGHTNESS,
> +				  &data, sizeof(data));
> +		break;
> +	}
> +
> +	return data;
> +}
> +
> +static void dcs_set_backlight(struct intel_connector *connector, u32 level)
> +{
> +	struct intel_encoder *encoder = connector->encoder;
> +	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
> +	struct mipi_dsi_device *dsi_device;
> +	u8 data = level;
> +	enum port port;
> +
> +	/* FIXME: Need to take care of 16 bit brightness level */
> +	for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
> +		dsi_device = intel_dsi->dsi_hosts[port]->device;
> +		mipi_dsi_dcs_write(dsi_device,
> MIPI_DCS_SET_DISPLAY_BRIGHTNESS,
> +				   &data, sizeof(data));
> +	}
> +}
> +
> +static void dcs_disable_backlight(struct intel_connector *connector)
> +{
> +	struct intel_encoder *encoder = connector->encoder;
> +	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
> +	struct mipi_dsi_device *dsi_device;
> +	enum port port;
> +
> +	dcs_set_backlight(connector, 0);
> +
> +	for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
> +		u8 ctrl = 0;
> +
> +		dsi_device = intel_dsi->dsi_hosts[port]->device;
> +
> +		mipi_dsi_dcs_read(dsi_device,
> MIPI_DCS_GET_CONTROL_DISPLAY,
> +				  &ctrl, sizeof(ctrl));
> +
> +		ctrl &= ~CONTROL_DISPLAY_BL;
> +		ctrl &= ~CONTROL_DISPLAY_DD;
> +		ctrl &= ~CONTROL_DISPLAY_BCTRL;
> +
> +		mipi_dsi_dcs_write(dsi_device,
> MIPI_DCS_WRITE_CONTROL_DISPLAY,
> +				   &ctrl, sizeof(ctrl));
> +	}
> +}
> +
> +static void dcs_enable_backlight(struct intel_connector *connector)
> +{
> +	struct intel_encoder *encoder = connector->encoder;
> +	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
> +	struct intel_panel *panel = &connector->panel;
> +	struct mipi_dsi_device *dsi_device;
> +	enum port port;
> +
> +	for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
> +		u8 ctrl = 0;
> +
> +		dsi_device = intel_dsi->dsi_hosts[port]->device;
> +
> +		mipi_dsi_dcs_read(dsi_device,
> MIPI_DCS_GET_CONTROL_DISPLAY,
> +				  &ctrl, sizeof(ctrl));
> +
> +		ctrl |= CONTROL_DISPLAY_BL;
> +		ctrl |= CONTROL_DISPLAY_DD;
> +		ctrl |= CONTROL_DISPLAY_BCTRL;
> +
> +		mipi_dsi_dcs_write(dsi_device,
> MIPI_DCS_WRITE_CONTROL_DISPLAY,
> +				   &ctrl, sizeof(ctrl));
> +	}
> +
> +	dcs_set_backlight(connector, panel->backlight.level);
> +}
> +
> +static int dcs_setup_backlight(struct intel_connector *connector,
> +			       enum pipe unused)
> +{
> +	struct intel_panel *panel = &connector->panel;
> +
> +	panel->backlight.max = PANEL_PWM_MAX_VALUE;
> +	panel->backlight.level = PANEL_PWM_MAX_VALUE;
> +
> +	return 0;
> +}
> +
> +int intel_dsi_dcs_init_backlight_funcs(struct intel_connector
> *intel_connector)
> +{
> +	struct drm_device *dev = intel_connector->base.dev;
> +	struct drm_i915_private *dev_priv = dev->dev_private;
> +	struct intel_encoder *encoder = intel_connector->encoder;
> +	struct intel_panel *panel = &intel_connector->panel;
> +
> +	if (dev_priv->vbt.backlight.type != INTEL_BACKLIGHT_DSI_DCS)
> +		return -ENODEV;
> +
> +	if (WARN_ON(encoder->type != INTEL_OUTPUT_DSI))
> +		return -EINVAL;
> +
> +	panel->backlight.setup = dcs_setup_backlight;
> +	panel->backlight.enable = dcs_enable_backlight;
> +	panel->backlight.disable = dcs_disable_backlight;
> +	panel->backlight.set = dcs_set_backlight;
> +	panel->backlight.get = dcs_get_backlight;
> +
> +	return 0;
> +}
> diff --git a/drivers/gpu/drm/i915/intel_panel.c
> b/drivers/gpu/drm/i915/intel_panel.c
> index 828f0fcaaaf8..efaee7a7f933 100644
> --- a/drivers/gpu/drm/i915/intel_panel.c
> +++ b/drivers/gpu/drm/i915/intel_panel.c
> @@ -1722,6 +1722,10 @@ intel_panel_init_backlight_funcs(struct
> intel_panel *panel)
>  	    intel_dp_aux_init_backlight_funcs(connector) == 0)
>  		return;
> 
> +	if (connector->base.connector_type ==
> DRM_MODE_CONNECTOR_DSI &&
> +	    intel_dsi_dcs_init_backlight_funcs(connector) == 0)
> +		return;
> +
>  	if (IS_BROXTON(dev_priv)) {
>  		panel->backlight.setup = bxt_setup_backlight;
>  		panel->backlight.enable = bxt_enable_backlight;
> --
> 2.1.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 10+ messages in thread

* ✗ Fi.CI.BAT: warning for drm/i915/dsi: dcs backlight control
  2016-04-26 13:14 [PATCH 0/3] drm/i915/dsi: dcs backlight control Jani Nikula
                   ` (2 preceding siblings ...)
  2016-04-26 13:14 ` [PATCH 3/3] CABC support for Panel PWM backlight control Jani Nikula
@ 2016-04-26 16:55 ` Patchwork
  3 siblings, 0 replies; 10+ messages in thread
From: Patchwork @ 2016-04-26 16:55 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx

== Series Details ==

Series: drm/i915/dsi: dcs backlight control
URL   : https://patchwork.freedesktop.org/series/6335/
State : warning

== Summary ==

Series 6335v1 drm/i915/dsi: dcs backlight control
http://patchwork.freedesktop.org/api/1.0/series/6335/revisions/1/mbox/

Test gem_sync:
        Subgroup basic-each:
                pass       -> DMESG-WARN (bsw-nuc-2)
Test kms_pipe_crc_basic:
        Subgroup hang-read-crc-pipe-b:
                incomplete -> DMESG-WARN (snb-dellxps)
Test pm_rpm:
        Subgroup basic-pci-d3-state:
                pass       -> DMESG-WARN (bsw-nuc-2)

bdw-nuci7        total:200  pass:188  dwarn:0   dfail:0   fail:0   skip:12 
bdw-ultra        total:200  pass:175  dwarn:0   dfail:0   fail:0   skip:25 
bsw-nuc-2        total:199  pass:156  dwarn:2   dfail:0   fail:0   skip:41 
byt-nuc          total:199  pass:158  dwarn:0   dfail:0   fail:0   skip:41 
hsw-brixbox      total:200  pass:174  dwarn:0   dfail:0   fail:0   skip:26 
hsw-gt2          total:200  pass:178  dwarn:0   dfail:0   fail:1   skip:21 
ivb-t430s        total:200  pass:169  dwarn:0   dfail:0   fail:0   skip:31 
skl-i7k-2        total:200  pass:173  dwarn:0   dfail:0   fail:0   skip:27 
skl-nuci5        total:200  pass:189  dwarn:0   dfail:0   fail:0   skip:11 
snb-dellxps      total:200  pass:157  dwarn:1   dfail:0   fail:0   skip:42 
snb-x220t        total:200  pass:158  dwarn:0   dfail:0   fail:1   skip:41 

Results at /archive/results/CI_IGT_test/Patchwork_2075/

e005db1cb2c60d18abe837ac683d8993ea77b239 drm-intel-nightly: 2016y-04m-26d-12h-51m-57s UTC integration manifest
6cfea01 CABC support for Panel PWM backlight control
25bbaa9 drm/i915: Add DCS control for Panel PWM
47a8d76 drm/i915: Parse LFP brightness control field in VBT

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] drm/i915: Parse LFP brightness control field in VBT
  2016-04-26 13:14 ` [PATCH 1/3] drm/i915: Parse LFP brightness control field in VBT Jani Nikula
@ 2016-05-02 13:46   ` Jani Nikula
  0 siblings, 0 replies; 10+ messages in thread
From: Jani Nikula @ 2016-05-02 13:46 UTC (permalink / raw)
  To: intel-gfx; +Cc: Deepak M

On Tue, 26 Apr 2016, Jani Nikula <jani.nikula@intel.com> wrote:
> From: Deepak M <m.deepak@intel.com>
>
> These fields in VBT indicates the PWM source which
> is used and also the controller number.
>
> v2 by Jani: check for out of bounds access, some renames, change default
> type, etc.
>
> v3 by Jani: s/INTEL_BACKLIGHT_CABC/INTEL_BACKLIGHT_DSI_DCS/
>
> Signed-off-by: Deepak M <m.deepak@intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>

Pushed this one to drm-intel-next-queued.

BR,
Jani.

> ---
>  drivers/gpu/drm/i915/i915_drv.h       | 1 +
>  drivers/gpu/drm/i915/intel_bios.c     | 9 +++++++++
>  drivers/gpu/drm/i915/intel_bios.h     | 8 ++++++++
>  drivers/gpu/drm/i915/intel_vbt_defs.h | 6 ++++++
>  4 files changed, 24 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 32f05979ade7..f86dd10dabfe 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -1488,6 +1488,7 @@ struct intel_vbt_data {
>  		bool present;
>  		bool active_low_pwm;
>  		u8 min_brightness;	/* min_brightness/255 of max */
> +		enum intel_backlight_type type;
>  	} backlight;
>  
>  	/* MIPI DSI */
> diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
> index dbbd59171722..81518116e00d 100644
> --- a/drivers/gpu/drm/i915/intel_bios.c
> +++ b/drivers/gpu/drm/i915/intel_bios.c
> @@ -318,6 +318,15 @@ parse_lfp_backlight(struct drm_i915_private *dev_priv,
>  		return;
>  	}
>  
> +	dev_priv->vbt.backlight.type = INTEL_BACKLIGHT_DISPLAY_DDI;
> +	if (bdb->version >= 191 &&
> +	    get_blocksize(backlight_data) >= sizeof(*backlight_data)) {
> +		const struct bdb_lfp_backlight_control_method *method;
> +
> +		method = &backlight_data->backlight_control[panel_type];
> +		dev_priv->vbt.backlight.type = method->type;
> +	}
> +
>  	dev_priv->vbt.backlight.pwm_freq_hz = entry->pwm_freq_hz;
>  	dev_priv->vbt.backlight.active_low_pwm = entry->active_low_pwm;
>  	dev_priv->vbt.backlight.min_brightness = entry->min_brightness;
> diff --git a/drivers/gpu/drm/i915/intel_bios.h b/drivers/gpu/drm/i915/intel_bios.h
> index 149c3226e895..8405b5a367d7 100644
> --- a/drivers/gpu/drm/i915/intel_bios.h
> +++ b/drivers/gpu/drm/i915/intel_bios.h
> @@ -30,6 +30,14 @@
>  #ifndef _INTEL_BIOS_H_
>  #define _INTEL_BIOS_H_
>  
> +enum intel_backlight_type {
> +	INTEL_BACKLIGHT_PMIC,
> +	INTEL_BACKLIGHT_LPSS,
> +	INTEL_BACKLIGHT_DISPLAY_DDI,
> +	INTEL_BACKLIGHT_DSI_DCS,
> +	INTEL_BACKLIGHT_PANEL_DRIVER_INTERFACE,
> +};
> +
>  struct edp_power_seq {
>  	u16 t1_t3;
>  	u16 t8;
> diff --git a/drivers/gpu/drm/i915/intel_vbt_defs.h b/drivers/gpu/drm/i915/intel_vbt_defs.h
> index 9ff1e960d617..a4a42f254c35 100644
> --- a/drivers/gpu/drm/i915/intel_vbt_defs.h
> +++ b/drivers/gpu/drm/i915/intel_vbt_defs.h
> @@ -446,10 +446,16 @@ struct bdb_lfp_backlight_data_entry {
>  	u8 obsolete3;
>  } __packed;
>  
> +struct bdb_lfp_backlight_control_method {
> +	u8 type:4;
> +	u8 controller:4;
> +} __packed;
> +
>  struct bdb_lfp_backlight_data {
>  	u8 entry_size;
>  	struct bdb_lfp_backlight_data_entry data[16];
>  	u8 level[16];
> +	struct bdb_lfp_backlight_control_method backlight_control[16];
>  } __packed;
>  
>  struct aimdb_header {

-- 
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/3] drm/i915: Add DCS control for Panel PWM
  2016-04-26 14:57   ` Adebisi, YetundeX
@ 2016-05-17 14:01     ` Jani Nikula
  0 siblings, 0 replies; 10+ messages in thread
From: Jani Nikula @ 2016-05-17 14:01 UTC (permalink / raw)
  To: Adebisi, YetundeX, intel-gfx; +Cc: Deepak, M, Vetter, Daniel

On Tue, 26 Apr 2016, "Adebisi, YetundeX" <yetundex.adebisi@intel.com> wrote:
>> -----Original Message-----
>> From: Nikula, Jani
>> Sent: Tuesday, April 26, 2016 2:14 PM
>> To: intel-gfx@lists.freedesktop.org
>> Cc: Nikula, Jani; Vetter, Daniel; Adebisi, YetundeX; Deepak, M
>> Subject: [PATCH 2/3] drm/i915: Add DCS control for Panel PWM
>> 
>> If the source of the backlight PWM is from the
>> panel then the PWM can be controlled by DCS
>> command, this patch adds the support to
>> enable/disbale panel PWM, control backlight level
>> etc...
>> 
>> v2: Moving the CABC bkl functions to new file.(Jani)
>> 
>> v3: Rebase
>> 
>> v4: Rebase
>> 
>> v5: Use mipi_dsi_dcs_write() instead of mipi_dsi_dcs_write_buffer() (Jani)
>>     Move DCS macro`s to include/video/mipi_display.h (Jani)
>> 
>> v6: Rename the file to intel_dsi_panel_pwm.c
>>     Removing the CABC operations
>> 
>> v7 by Jani: renames, rebases, etc.
>> 
>> v8 by Jani: s/INTEL_BACKLIGHT_CABC/INTEL_BACKLIGHT_DSI_DCS/
>> 
>> v9 by Jani: rename init function to intel_dsi_dcs_init_backlight_funcs
>> 
>> Cc: Jani Nikula <jani.nikula@intel.com>
>> Cc: Daniel Vetter <daniel.vetter@intel.com>
>> Cc: Yetunde Adebisi <yetundex.adebisi@intel.com>
>> Signed-off-by: Deepak M <m.deepak@intel.com>
>> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
>
> Reviewed-by: Yetunde Adebisi <yetundex.adebisi@intel.com>

Pushed both to drm-intel-next-queued, thanks for the review.

BR,
Jani.



>> ---
>>  drivers/gpu/drm/i915/Makefile                  |   1 +
>>  drivers/gpu/drm/i915/intel_drv.h               |   2 +
>>  drivers/gpu/drm/i915/intel_dsi.c               |  19 ++-
>>  drivers/gpu/drm/i915/intel_dsi.h               |   3 +
>>  drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c | 157
>> +++++++++++++++++++++++++
>>  drivers/gpu/drm/i915/intel_panel.c             |   4 +
>>  6 files changed, 184 insertions(+), 2 deletions(-)
>>  create mode 100644 drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
>> 
>> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
>> index 723c50251127..b5ec800f953e 100644
>> --- a/drivers/gpu/drm/i915/Makefile
>> +++ b/drivers/gpu/drm/i915/Makefile
>> @@ -86,6 +86,7 @@ i915-y += dvo_ch7017.o \
>>  	  intel_dp_mst.o \
>>  	  intel_dp.o \
>>  	  intel_dsi.o \
>> +	  intel_dsi_dcs_backlight.o \
>>  	  intel_dsi_panel_vbt.o \
>>  	  intel_dsi_pll.o \
>>  	  intel_dvo.o \
>> diff --git a/drivers/gpu/drm/i915/intel_drv.h
>> b/drivers/gpu/drm/i915/intel_drv.h
>> index cb89a35a6755..d65dfbb8cf7d 100644
>> --- a/drivers/gpu/drm/i915/intel_drv.h
>> +++ b/drivers/gpu/drm/i915/intel_drv.h
>> @@ -1346,6 +1346,8 @@ void intel_dp_mst_encoder_cleanup(struct
>> intel_digital_port *intel_dig_port);
>>  /* intel_dsi.c */
>>  void intel_dsi_init(struct drm_device *dev);
>> 
>> +/* intel_dsi_dcs_backlight.c */
>> +int intel_dsi_dcs_init_backlight_funcs(struct intel_connector
>> *intel_connector);
>> 
>>  /* intel_dvo.c */
>>  void intel_dvo_init(struct drm_device *dev);
>> diff --git a/drivers/gpu/drm/i915/intel_dsi.c
>> b/drivers/gpu/drm/i915/intel_dsi.c
>> index 2b22bb9bb86f..2209f9fe6c4b 100644
>> --- a/drivers/gpu/drm/i915/intel_dsi.c
>> +++ b/drivers/gpu/drm/i915/intel_dsi.c
>> @@ -1364,10 +1364,25 @@ void intel_dsi_init(struct drm_device *dev)
>>  	else
>>  		intel_encoder->crtc_mask = BIT(PIPE_B);
>> 
>> -	if (dev_priv->vbt.dsi.config->dual_link)
>> +	if (dev_priv->vbt.dsi.config->dual_link) {
>>  		intel_dsi->ports = BIT(PORT_A) | BIT(PORT_C);
>> -	else
>> +
>> +		switch (dev_priv->vbt.dsi.config->dl_dcs_backlight_ports) {
>> +		case DL_DCS_PORT_A:
>> +			intel_dsi->dcs_backlight_ports = BIT(PORT_A);
>> +			break;
>> +		case DL_DCS_PORT_C:
>> +			intel_dsi->dcs_backlight_ports = BIT(PORT_C);
>> +			break;
>> +		default:
>> +		case DL_DCS_PORT_A_AND_C:
>> +			intel_dsi->dcs_backlight_ports = BIT(PORT_A) |
>> BIT(PORT_C);
>> +			break;
>> +		}
>> +	} else {
>>  		intel_dsi->ports = BIT(port);
>> +		intel_dsi->dcs_backlight_ports = BIT(port);
>> +	}
>> 
>>  	/* Create a DSI host (and a device) for each port. */
>>  	for_each_dsi_port(port, intel_dsi->ports) {
>> diff --git a/drivers/gpu/drm/i915/intel_dsi.h
>> b/drivers/gpu/drm/i915/intel_dsi.h
>> index 61a6957fc6c2..b00fb3fbb0b1 100644
>> --- a/drivers/gpu/drm/i915/intel_dsi.h
>> +++ b/drivers/gpu/drm/i915/intel_dsi.h
>> @@ -78,6 +78,9 @@ struct intel_dsi {
>> 
>>  	u8 escape_clk_div;
>>  	u8 dual_link;
>> +
>> +	u16 dcs_backlight_ports;
>> +
>>  	u8 pixel_overlap;
>>  	u32 port_bits;
>>  	u32 bw_timer;
>> diff --git a/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
>> b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
>> new file mode 100644
>> index 000000000000..7f9bbffa7f8c
>> --- /dev/null
>> +++ b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
>> @@ -0,0 +1,157 @@
>> +/*
>> + * Copyright © 2016 Intel Corporation
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the
>> "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including the next
>> + * paragraph) shall be included in all copies or substantial portions of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>> EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>> MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO
>> EVENT SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
>> DAMAGES OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>> ARISING
>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
>> OTHER
>> + * DEALINGS IN THE SOFTWARE.
>> + *
>> + * Author: Deepak M <m.deepak at intel.com>
>> + */
>> +
>> +#include "intel_drv.h"
>> +#include "intel_dsi.h"
>> +#include "i915_drv.h"
>> +#include <video/mipi_display.h>
>> +#include <drm/drm_mipi_dsi.h>
>> +
>> +#define CONTROL_DISPLAY_BCTRL		(1 << 5)
>> +#define CONTROL_DISPLAY_DD		(1 << 3)
>> +#define CONTROL_DISPLAY_BL		(1 << 2)
>> +
>> +#define PANEL_PWM_MAX_VALUE		0xFF
>> +
>> +static u32 dcs_get_backlight(struct intel_connector *connector)
>> +{
>> +	struct intel_encoder *encoder = connector->encoder;
>> +	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
>> +	struct mipi_dsi_device *dsi_device;
>> +	u8 data;
>> +	enum port port;
>> +
>> +	/* FIXME: Need to take care of 16 bit brightness level */
>> +	for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
>> +		dsi_device = intel_dsi->dsi_hosts[port]->device;
>> +		mipi_dsi_dcs_read(dsi_device,
>> MIPI_DCS_GET_DISPLAY_BRIGHTNESS,
>> +				  &data, sizeof(data));
>> +		break;
>> +	}
>> +
>> +	return data;
>> +}
>> +
>> +static void dcs_set_backlight(struct intel_connector *connector, u32 level)
>> +{
>> +	struct intel_encoder *encoder = connector->encoder;
>> +	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
>> +	struct mipi_dsi_device *dsi_device;
>> +	u8 data = level;
>> +	enum port port;
>> +
>> +	/* FIXME: Need to take care of 16 bit brightness level */
>> +	for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
>> +		dsi_device = intel_dsi->dsi_hosts[port]->device;
>> +		mipi_dsi_dcs_write(dsi_device,
>> MIPI_DCS_SET_DISPLAY_BRIGHTNESS,
>> +				   &data, sizeof(data));
>> +	}
>> +}
>> +
>> +static void dcs_disable_backlight(struct intel_connector *connector)
>> +{
>> +	struct intel_encoder *encoder = connector->encoder;
>> +	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
>> +	struct mipi_dsi_device *dsi_device;
>> +	enum port port;
>> +
>> +	dcs_set_backlight(connector, 0);
>> +
>> +	for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
>> +		u8 ctrl = 0;
>> +
>> +		dsi_device = intel_dsi->dsi_hosts[port]->device;
>> +
>> +		mipi_dsi_dcs_read(dsi_device,
>> MIPI_DCS_GET_CONTROL_DISPLAY,
>> +				  &ctrl, sizeof(ctrl));
>> +
>> +		ctrl &= ~CONTROL_DISPLAY_BL;
>> +		ctrl &= ~CONTROL_DISPLAY_DD;
>> +		ctrl &= ~CONTROL_DISPLAY_BCTRL;
>> +
>> +		mipi_dsi_dcs_write(dsi_device,
>> MIPI_DCS_WRITE_CONTROL_DISPLAY,
>> +				   &ctrl, sizeof(ctrl));
>> +	}
>> +}
>> +
>> +static void dcs_enable_backlight(struct intel_connector *connector)
>> +{
>> +	struct intel_encoder *encoder = connector->encoder;
>> +	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
>> +	struct intel_panel *panel = &connector->panel;
>> +	struct mipi_dsi_device *dsi_device;
>> +	enum port port;
>> +
>> +	for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
>> +		u8 ctrl = 0;
>> +
>> +		dsi_device = intel_dsi->dsi_hosts[port]->device;
>> +
>> +		mipi_dsi_dcs_read(dsi_device,
>> MIPI_DCS_GET_CONTROL_DISPLAY,
>> +				  &ctrl, sizeof(ctrl));
>> +
>> +		ctrl |= CONTROL_DISPLAY_BL;
>> +		ctrl |= CONTROL_DISPLAY_DD;
>> +		ctrl |= CONTROL_DISPLAY_BCTRL;
>> +
>> +		mipi_dsi_dcs_write(dsi_device,
>> MIPI_DCS_WRITE_CONTROL_DISPLAY,
>> +				   &ctrl, sizeof(ctrl));
>> +	}
>> +
>> +	dcs_set_backlight(connector, panel->backlight.level);
>> +}
>> +
>> +static int dcs_setup_backlight(struct intel_connector *connector,
>> +			       enum pipe unused)
>> +{
>> +	struct intel_panel *panel = &connector->panel;
>> +
>> +	panel->backlight.max = PANEL_PWM_MAX_VALUE;
>> +	panel->backlight.level = PANEL_PWM_MAX_VALUE;
>> +
>> +	return 0;
>> +}
>> +
>> +int intel_dsi_dcs_init_backlight_funcs(struct intel_connector
>> *intel_connector)
>> +{
>> +	struct drm_device *dev = intel_connector->base.dev;
>> +	struct drm_i915_private *dev_priv = dev->dev_private;
>> +	struct intel_encoder *encoder = intel_connector->encoder;
>> +	struct intel_panel *panel = &intel_connector->panel;
>> +
>> +	if (dev_priv->vbt.backlight.type != INTEL_BACKLIGHT_DSI_DCS)
>> +		return -ENODEV;
>> +
>> +	if (WARN_ON(encoder->type != INTEL_OUTPUT_DSI))
>> +		return -EINVAL;
>> +
>> +	panel->backlight.setup = dcs_setup_backlight;
>> +	panel->backlight.enable = dcs_enable_backlight;
>> +	panel->backlight.disable = dcs_disable_backlight;
>> +	panel->backlight.set = dcs_set_backlight;
>> +	panel->backlight.get = dcs_get_backlight;
>> +
>> +	return 0;
>> +}
>> diff --git a/drivers/gpu/drm/i915/intel_panel.c
>> b/drivers/gpu/drm/i915/intel_panel.c
>> index 828f0fcaaaf8..efaee7a7f933 100644
>> --- a/drivers/gpu/drm/i915/intel_panel.c
>> +++ b/drivers/gpu/drm/i915/intel_panel.c
>> @@ -1722,6 +1722,10 @@ intel_panel_init_backlight_funcs(struct
>> intel_panel *panel)
>>  	    intel_dp_aux_init_backlight_funcs(connector) == 0)
>>  		return;
>> 
>> +	if (connector->base.connector_type ==
>> DRM_MODE_CONNECTOR_DSI &&
>> +	    intel_dsi_dcs_init_backlight_funcs(connector) == 0)
>> +		return;
>> +
>>  	if (IS_BROXTON(dev_priv)) {
>>  		panel->backlight.setup = bxt_setup_backlight;
>>  		panel->backlight.enable = bxt_enable_backlight;
>> --
>> 2.1.4
>

-- 
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2016-05-17 14:03 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-04-26 13:14 [PATCH 0/3] drm/i915/dsi: dcs backlight control Jani Nikula
2016-04-26 13:14 ` [PATCH 1/3] drm/i915: Parse LFP brightness control field in VBT Jani Nikula
2016-05-02 13:46   ` Jani Nikula
2016-04-26 13:14 ` [PATCH 2/3] drm/i915: Add DCS control for Panel PWM Jani Nikula
2016-04-26 14:14   ` kbuild test robot
2016-04-26 14:57   ` Adebisi, YetundeX
2016-05-17 14:01     ` Jani Nikula
2016-04-26 13:14 ` [PATCH 3/3] CABC support for Panel PWM backlight control Jani Nikula
2016-04-26 14:23   ` kbuild test robot
2016-04-26 16:55 ` ✗ Fi.CI.BAT: warning for drm/i915/dsi: dcs " Patchwork

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.