From patchwork Fri Sep 11 04:47:48 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Deepak M X-Patchwork-Id: 7157421 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 6CCF3BF036 for ; Fri, 11 Sep 2015 04:43:59 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6A93A20684 for ; Fri, 11 Sep 2015 04:43:58 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 1045C2064B for ; Fri, 11 Sep 2015 04:43:57 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 70E186ED51; Thu, 10 Sep 2015 21:43:56 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTP id 13BE78A438 for ; Thu, 10 Sep 2015 21:43:55 -0700 (PDT) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP; 10 Sep 2015 21:43:54 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.17,509,1437462000"; d="scan'208";a="802178584" Received: from mdeepakubuntudesk01-desktop.iind.intel.com ([10.223.25.91]) by orsmga002.jf.intel.com with ESMTP; 10 Sep 2015 21:43:53 -0700 From: Deepak M To: intel-gfx@lists.freedesktop.org Date: Fri, 11 Sep 2015 10:17:48 +0530 Message-Id: <1441946868-4985-3-git-send-email-m.deepak@intel.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1441946868-4985-1-git-send-email-m.deepak@intel.com> References: <1441946868-4985-1-git-send-email-m.deepak@intel.com> Cc: Deepak M Subject: [Intel-gfx] [RFC CABC v3 PATCH 2/2] drm/i915: CABC support for backlight control X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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. In this design there will be no PWM signal from the SoC and DCS commands are sent to enable and control the backlight brightness. v2: - Created a new backlight driver for cabc, which will be registered only when it cabc is supported by panel. (Daniel Vetter) v3: - Use for_each_dsi_port macro for handling port C also (Gaurav) - Rebase Signed-off-by: Deepak M --- drivers/gpu/drm/i915/Makefile | 1 + drivers/gpu/drm/i915/intel_dsi.c | 18 +++++++++++++++--- drivers/gpu/drm/i915/intel_panel.c | 23 +++++++++++++++++++---- include/video/mipi_display.h | 8 ++++++++ 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index 44d290a..d87c690 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -82,6 +82,7 @@ i915-y += dvo_ch7017.o \ intel_dsi.o \ intel_dsi_panel_vbt.o \ intel_dsi_pll.o \ + intel_dsi_cabc.o \ intel_dvo.o \ intel_hdmi.o \ intel_i2c.o \ diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c index 781c267..1d98ed8 100644 --- a/drivers/gpu/drm/i915/intel_dsi.c +++ b/drivers/gpu/drm/i915/intel_dsi.c @@ -35,6 +35,7 @@ #include "i915_drv.h" #include "intel_drv.h" #include "intel_dsi.h" +#include "intel_dsi_cabc.h" static const struct { u16 panel_id; @@ -398,7 +399,10 @@ static void intel_dsi_enable(struct intel_encoder *encoder) intel_dsi_port_enable(encoder); } - intel_panel_enable_backlight(intel_dsi->attached_connector); + if (dev_priv->vbt.dsi.config->cabc_supported) + cabc_enable_backlight(intel_dsi->attached_connector); + else + intel_panel_enable_backlight(intel_dsi->attached_connector); } static void intel_dsi_pre_enable(struct intel_encoder *encoder) @@ -458,12 +462,17 @@ static void intel_dsi_enable_nop(struct intel_encoder *encoder) static void intel_dsi_pre_disable(struct intel_encoder *encoder) { + struct drm_device *dev = encoder->base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); enum port port; DRM_DEBUG_KMS("\n"); - intel_panel_disable_backlight(intel_dsi->attached_connector); + if (dev_priv->vbt.dsi.config->cabc_supported) + cabc_disable_backlight(intel_dsi->attached_connector); + else + intel_panel_disable_backlight(intel_dsi->attached_connector); if (is_vid_mode(intel_dsi)) { /* Send Shutdown command to the panel in LP mode */ @@ -1133,7 +1142,10 @@ void intel_dsi_init(struct drm_device *dev) } intel_panel_init(&intel_connector->panel, fixed_mode, NULL); - intel_panel_setup_backlight(connector, INVALID_PIPE); + if (dev_priv->vbt.dsi.config->cabc_supported) + cabc_setup_backlight(connector, INVALID_PIPE); + else + intel_panel_setup_backlight(connector, INVALID_PIPE); return; diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index e2ab3f6..ff2e586 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c @@ -34,6 +34,7 @@ #include #include #include "intel_drv.h" +#include "intel_dsi_cabc.h" #define CRC_PMIC_PWM_PERIOD_NS 21333 @@ -1586,15 +1587,29 @@ void intel_panel_fini(struct intel_panel *panel) void intel_backlight_register(struct drm_device *dev) { struct intel_connector *connector; + struct drm_i915_private *dev_priv = dev->dev_private; - list_for_each_entry(connector, &dev->mode_config.connector_list, base.head) - intel_backlight_device_register(connector); + list_for_each_entry(connector, &dev->mode_config.connector_list, + base.head) { + if (connector->encoder->type == INTEL_OUTPUT_DSI && + dev_priv->vbt.dsi.config->cabc_supported) + cabc_backlight_device_register(connector); + else + intel_backlight_device_register(connector); + } } void intel_backlight_unregister(struct drm_device *dev) { struct intel_connector *connector; + struct drm_i915_private *dev_priv = dev->dev_private; - list_for_each_entry(connector, &dev->mode_config.connector_list, base.head) - intel_backlight_device_unregister(connector); + list_for_each_entry(connector, &dev->mode_config.connector_list, + base.head) { + if (connector->encoder->type == INTEL_OUTPUT_DSI && + dev_priv->vbt.dsi.config->cabc_supported) + cabc_backlight_device_unregister(connector); + else + intel_backlight_device_unregister(connector); + } } diff --git a/include/video/mipi_display.h b/include/video/mipi_display.h index ddcc8ca..5b8eeec 100644 --- a/include/video/mipi_display.h +++ b/include/video/mipi_display.h @@ -117,6 +117,14 @@ enum { MIPI_DCS_GET_SCANLINE = 0x45, MIPI_DCS_READ_DDB_START = 0xA1, MIPI_DCS_READ_DDB_CONTINUE = 0xA8, + MIPI_DCS_CABC_LEVEL_RD = 0x52, + MIPI_DCS_CABC_MIN_BRIGHTNESS_RD = 0x5F, + MIPI_DCS_CABC_CONTROL_RD = 0x56, + MIPI_DCS_CABC_CONTROL_BRIGHT_RD = 0x54, + MIPI_DCS_CABC_LEVEL_WR = 0x51, + MIPI_DCS_CABC_MIN_BRIGHTNESS_WR = 0x5E, + MIPI_DCS_CABC_CONTROL_WR = 0x55, + MIPI_DCS_CABC_CONTROL_BRIGHT_WR = 0x53, }; /* MIPI DCS pixel formats */