diff mbox

[3/3] CABC support for Panel PWM backlight control

Message ID 883faade74d2e598b143221ccc7df6daf4393a13.1461676337.git.jani.nikula@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jani Nikula April 26, 2016, 1:14 p.m. UTC
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(+)

Comments

kernel test robot April 26, 2016, 2:23 p.m. UTC | #1
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
diff mbox

Patch

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);
 }