[2/2] drm/i915: Add functions to execute the new sequences from VBT
diff mbox

Message ID 1455881334-3295-2-git-send-email-m.deepak@intel.com
State New
Headers show

Commit Message

Deepak M Feb. 19, 2016, 11:28 a.m. UTC
From: Gaurav K Singh <gaurav.k.singh@intel.com>

New sequences are added in the mipi sequence block of the
VBT from version 3 onwards. The sequences are added to
make the code more generic as the panel related info
are placed in the VBT.

Cc: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Gaurav K Singh <gaurav.k.singh@intel.com>
Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
Signed-off-by: Deepak M <m.deepak@intel.com>
---
 drivers/gpu/drm/i915/intel_dsi_panel_vbt.c | 48 ++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

Comments

Jani Nikula Feb. 19, 2016, 2:03 p.m. UTC | #1
On Fri, 19 Feb 2016, Deepak M <m.deepak@intel.com> wrote:
> From: Gaurav K Singh <gaurav.k.singh@intel.com>
>
> New sequences are added in the mipi sequence block of the
> VBT from version 3 onwards. The sequences are added to
> make the code more generic as the panel related info
> are placed in the VBT.
>
> Cc: Jani Nikula <jani.nikula@intel.com>
> Signed-off-by: Gaurav K Singh <gaurav.k.singh@intel.com>
> Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
> Signed-off-by: Deepak M <m.deepak@intel.com>
> ---
>  drivers/gpu/drm/i915/intel_dsi_panel_vbt.c | 48 ++++++++++++++++++++++++++++++
>  1 file changed, 48 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c b/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c
> index c6e18fe..db8e210 100644
> --- a/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c
> +++ b/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c
> @@ -1035,12 +1035,60 @@ static int vbt_panel_get_modes(struct drm_panel *panel)
>  	return 1;
>  }
>  
> +static int vbt_panel_power_on(struct drm_panel *panel)
> +{
> +	generic_exec_sequence(panel, MIPI_SEQ_POWER_ON);
> +
> +	return 0;
> +}
> +
> +static int vbt_panel_power_off(struct drm_panel *panel)
> +{
> +	generic_exec_sequence(panel, MIPI_SEQ_POWER_OFF);
> +
> +	return 0;
> +}
> +
> +static int vbt_panel_backlight_on(struct drm_panel *panel)
> +{
> +	generic_exec_sequence(panel, MIPI_SEQ_BACKLIGHT_ON);
> +
> +	return 0;
> +}
> +
> +static int vbt_panel_backlight_off(struct drm_panel *panel)
> +{
> +	generic_exec_sequence(panel, MIPI_SEQ_BACKLIGHT_OFF);
> +
> +	return 0;
> +}
> +
> +static int vbt_panel_get_info(struct drm_panel *panel,
> +					struct drm_connector *connector)
> +{
> +	struct intel_connector *intel_connector =
> +				to_intel_connector(connector);
> +
> +	if (intel_connector) {
> +		connector->display_info.width_mm =
> +				intel_connector->panel.fixed_mode->width_mm;
> +		connector->display_info.height_mm =
> +				intel_connector->panel.fixed_mode->height_mm;
> +	}
> +	return 0;

I think we could do this part in the ->get_modes hook. For all the other
displays, it's the ->get_modes hook that reads the EDID, and ultimately
sets the display_info from EDID. We wouldn't need a new hook at all.

Also, this should be a separate change. If we can get the size
information from the fixed mode from VBT, we should do that in
->get_modes, and backport this fix for stable kernels. It's sorely
needed for BYT/CHV too.


BR,
Jani.


> +}
> +
>  static const struct drm_panel_funcs vbt_panel_funcs = {
>  	.disable = vbt_panel_disable,
>  	.unprepare = vbt_panel_unprepare,
>  	.prepare = vbt_panel_prepare,
>  	.enable = vbt_panel_enable,
>  	.get_modes = vbt_panel_get_modes,
> +	.power_on = vbt_panel_power_on,
> +	.power_off = vbt_panel_power_off,
> +	.backlight_on = vbt_panel_backlight_on,
> +	.backlight_off = vbt_panel_backlight_off,
> +	.get_info = vbt_panel_get_info,
>  };
>  
>  struct drm_panel *vbt_panel_init(struct intel_dsi *intel_dsi, u16 panel_id)

Patch
diff mbox

diff --git a/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c b/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c
index c6e18fe..db8e210 100644
--- a/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c
+++ b/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c
@@ -1035,12 +1035,60 @@  static int vbt_panel_get_modes(struct drm_panel *panel)
 	return 1;
 }
 
+static int vbt_panel_power_on(struct drm_panel *panel)
+{
+	generic_exec_sequence(panel, MIPI_SEQ_POWER_ON);
+
+	return 0;
+}
+
+static int vbt_panel_power_off(struct drm_panel *panel)
+{
+	generic_exec_sequence(panel, MIPI_SEQ_POWER_OFF);
+
+	return 0;
+}
+
+static int vbt_panel_backlight_on(struct drm_panel *panel)
+{
+	generic_exec_sequence(panel, MIPI_SEQ_BACKLIGHT_ON);
+
+	return 0;
+}
+
+static int vbt_panel_backlight_off(struct drm_panel *panel)
+{
+	generic_exec_sequence(panel, MIPI_SEQ_BACKLIGHT_OFF);
+
+	return 0;
+}
+
+static int vbt_panel_get_info(struct drm_panel *panel,
+					struct drm_connector *connector)
+{
+	struct intel_connector *intel_connector =
+				to_intel_connector(connector);
+
+	if (intel_connector) {
+		connector->display_info.width_mm =
+				intel_connector->panel.fixed_mode->width_mm;
+		connector->display_info.height_mm =
+				intel_connector->panel.fixed_mode->height_mm;
+	}
+	return 0;
+}
+
 static const struct drm_panel_funcs vbt_panel_funcs = {
 	.disable = vbt_panel_disable,
 	.unprepare = vbt_panel_unprepare,
 	.prepare = vbt_panel_prepare,
 	.enable = vbt_panel_enable,
 	.get_modes = vbt_panel_get_modes,
+	.power_on = vbt_panel_power_on,
+	.power_off = vbt_panel_power_off,
+	.backlight_on = vbt_panel_backlight_on,
+	.backlight_off = vbt_panel_backlight_off,
+	.get_info = vbt_panel_get_info,
 };
 
 struct drm_panel *vbt_panel_init(struct intel_dsi *intel_dsi, u16 panel_id)