From mboxrd@z Thu Jan 1 00:00:00 1970 From: Keith Packard Subject: Re: i915 native backlight never got merged Date: Thu, 11 Aug 2011 15:28:52 -0700 Message-ID: References: <1312829662.3379.138.camel@fourier> <20110808213140.GA32504@srcf.ucam.org> <4E428421.1000605@fedoraproject.org> <20110810191700.81c3a7ee.akpm@linux-foundation.org> <20112108083014@lilem.mirepesht> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2080386882==" Return-path: Received: from keithp.com (home.keithp.com [63.227.221.253]) by gabe.freedesktop.org (Postfix) with ESMTP id 8F0EF9E916 for ; Thu, 11 Aug 2011 15:28:57 -0700 (PDT) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org Errors-To: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org To: Michel Alexandre Salim , Ali Gholami Rudi Cc: Andrew Morton , intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org --===============2080386882== Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha1; protocol="application/pgp-signature" --=-=-= Content-Transfer-Encoding: quoted-printable On Thu, 11 Aug 2011 21:36:38 +0200, Michel Alexandre Salim wrote: > Since there's no known regression introduced by Matthew's patch, could > it be merged? Feel free to add a I've had to amend the patch a bit to get it to apply on top of drm-intel-fixes; anyone care to take a look and see if it still looks reasonable (and/or actually works?) From=202c17b1ae587289501029daa5c0692818b88d21a6 Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Fri, 14 Jan 2011 14:24:22 -0500 Subject: [PATCH] i915: Add native backlight control Not all systems expose a firmware or platform mechanism for changing the backlight intensity on i915, so add native driver support. Signed-off-by: Matthew Garrett Cc: intel-gfx Tested-by: Michel Alexandre Salim Signed-off-by: Keith Packard =2D-- drivers/gpu/drm/i915/i915_drv.h | 3 + drivers/gpu/drm/i915/intel_dp.c | 7 +++ drivers/gpu/drm/i915/intel_drv.h | 3 +- drivers/gpu/drm/i915/intel_lvds.c | 5 ++ drivers/gpu/drm/i915/intel_opregion.c | 1 - drivers/gpu/drm/i915/intel_panel.c | 72 +++++++++++++++++++++++++++++= +++- 6 files changed, 88 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_dr= v.h index 303e4b3..cfcf3c2 100644 =2D-- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -36,6 +36,7 @@ #include #include #include +#include =20 /* General customization: */ @@ -691,6 +692,7 @@ typedef struct drm_i915_private { int child_dev_num; struct child_device_config *child_dev; struct drm_connector *int_lvds_connector; + struct drm_connector *int_edp_connector; =20 bool mchbar_need_disable; =20 @@ -728,6 +730,7 @@ typedef struct drm_i915_private { struct drm_property *force_audio_property; =20 atomic_t forcewake_count; + struct backlight_device *backlight; } drm_i915_private_t; =20 enum i915_cache_level { diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_d= p.c index 0feae90..44fef5e 100644 =2D-- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -1841,6 +1841,11 @@ done: static void intel_dp_destroy (struct drm_connector *connector) { + struct drm_device *dev =3D connector->dev; + + if (intel_dpd_is_edp(dev)) + intel_panel_destroy_backlight(dev); + drm_sysfs_connector_remove(connector); drm_connector_cleanup(connector); kfree(connector); @@ -2072,6 +2077,8 @@ intel_dp_init(struct drm_device *dev, int output_reg) DRM_MODE_TYPE_PREFERRED; } } + dev_priv->int_edp_connector =3D connector; + intel_panel_setup_backlight(dev); } =20 intel_dp_add_properties(intel_dp, connector); diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_= drv.h index 7b330e7..6d55d94 100644 =2D-- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -297,10 +297,11 @@ extern void intel_pch_panel_fitting(struct drm_device= *dev, extern u32 intel_panel_get_max_backlight(struct drm_device *dev); extern u32 intel_panel_get_backlight(struct drm_device *dev); extern void intel_panel_set_backlight(struct drm_device *dev, u32 level); =2Dextern void intel_panel_setup_backlight(struct drm_device *dev); +extern int intel_panel_setup_backlight(struct drm_device *dev); extern void intel_panel_enable_backlight(struct drm_device *dev); extern void intel_panel_disable_backlight(struct drm_device *dev); extern enum drm_connector_status intel_panel_detect(struct drm_device *dev= ); +extern void intel_panel_destroy_backlight(struct drm_device *dev); =20 extern void intel_crtc_load_lut(struct drm_crtc *crtc); extern void intel_encoder_prepare (struct drm_encoder *encoder); diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel= _lvds.c index 8b521a2..31da77f 100644 =2D-- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c @@ -552,6 +552,8 @@ static void intel_lvds_destroy(struct drm_connector *co= nnector) struct drm_device *dev =3D connector->dev; struct drm_i915_private *dev_priv =3D dev->dev_private; =20 + intel_panel_destroy_backlight(dev); + if (dev_priv->lid_notifier.notifier_call) acpi_lid_notifier_unregister(&dev_priv->lid_notifier); drm_sysfs_connector_remove(connector); @@ -1032,6 +1034,9 @@ out: /* keep the LVDS connector */ dev_priv->int_lvds_connector =3D connector; drm_sysfs_connector_add(connector); + + intel_panel_setup_backlight(dev); + return true; =20 failed: diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/i= ntel_opregion.c index b7c5ddb..b8e8158b 100644 =2D-- a/drivers/gpu/drm/i915/intel_opregion.c +++ b/drivers/gpu/drm/i915/intel_opregion.c @@ -227,7 +227,6 @@ void intel_opregion_asle_intr(struct drm_device *dev) asle->aslc =3D asle_stat; } =20 =2D/* Only present on Ironlake+ */ void intel_opregion_gse_intr(struct drm_device *dev) { struct drm_i915_private *dev_priv =3D dev->dev_private; diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/inte= l_panel.c index 05f500c..a9e0c7b 100644 =2D-- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c @@ -277,7 +277,7 @@ void intel_panel_enable_backlight(struct drm_device *de= v) dev_priv->backlight_enabled =3D true; } =20 =2Dvoid intel_panel_setup_backlight(struct drm_device *dev) +static void intel_panel_init_backlight(struct drm_device *dev) { struct drm_i915_private *dev_priv =3D dev->dev_private; =20 @@ -309,3 +309,73 @@ intel_panel_detect(struct drm_device *dev) =20 return connector_status_unknown; } + +#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE +static int intel_panel_update_status(struct backlight_device *bd) +{ + struct drm_device *dev =3D bl_get_data(bd); + intel_panel_set_backlight(dev, bd->props.brightness); + return 0; +} + +static int intel_panel_get_brightness(struct backlight_device *bd) +{ + struct drm_device *dev =3D bl_get_data(bd); + return intel_panel_get_backlight(dev); +} + +static const struct backlight_ops intel_panel_bl_ops =3D { + .update_status =3D intel_panel_update_status, + .get_brightness =3D intel_panel_get_brightness, +}; + +int intel_panel_setup_backlight(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv =3D dev->dev_private; + struct backlight_properties props; + struct drm_connector *connector; + + intel_panel_init_backlight(dev); + + if (dev_priv->int_lvds_connector) + connector =3D dev_priv->int_lvds_connector; + else if (dev_priv->int_edp_connector) + connector =3D dev_priv->int_edp_connector; + else + return -ENODEV; + + props.type =3D BACKLIGHT_RAW; + props.max_brightness =3D intel_panel_get_max_backlight(dev); + dev_priv->backlight =3D + backlight_device_register("intel_backlight", + &connector->kdev, dev, + &intel_panel_bl_ops, &props); + + if (IS_ERR(dev_priv->backlight)) { + DRM_ERROR("Failed to register backlight: %ld\n", + PTR_ERR(dev_priv->backlight)); + dev_priv->backlight =3D NULL; + return -ENODEV; + } + dev_priv->backlight->props.brightness =3D intel_panel_get_backlight(dev); + return 0; +} + +void intel_panel_destroy_backlight(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv =3D dev->dev_private; + if (dev_priv->backlight) + backlight_device_unregister(dev_priv->backlight); +} +#else +int intel_panel_setup_backlight(struct drm_device *dev) +{ + intel_panel_init_backlight(dev); + return 0; +} + +void intel_panel_destroy_backlight(struct drm_device *dev) +{ + return; +} +#endif =2D-=20 1.7.5.4 =2D-=20 keith.packard@intel.com --=-=-= Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iD8DBQFORFekQp8BWwlsTdMRAhsmAJ4prvXn286S2dEhFMV/wjusSyvlFgCgstUC DvUQG4UgGPX1Iq8s+HVIKE8= =fl2x -----END PGP SIGNATURE----- --=-=-=-- --===============2080386882== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx --===============2080386882==--