All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jean-Francois Dagenais <jeff.dagenais@gmail.com>
To: intel-gfx@lists.freedesktop.org
Cc: Matthew Garrett <mjg@redhat.com>
Subject: i915 native backlight (resend for intel-gfx)
Date: Wed, 7 Sep 2011 10:31:20 -0400	[thread overview]
Message-ID: <FD98F2BC-8D46-4EF3-A151-A9006F122B85@gmail.com> (raw)

Hi all,

I had a patch from Matthew Garrett a little while back called "i915: Add native backlight control" which I added straight onto v2.6.37 (plus a minor include tweak to make compile if I remember correctly) And it worked with my setup. Using a Kontron ETXexpress-PC (ETXexpress®-PC with GS45 chipset, Intel® Core™2 Duo SU 9300. In the BIOS setup, the setting for backlight is indeed set to "PWM". From what I understand, this a pin straight from the COM slot which carries a PWM dutycycle that we send to the panel we attachusing the JILI (Jumptech Intelligent lvds interface) panel connector.

Now with the most recent kernel I thought I could drop the patch and use the tree as is for backlight since commit aaa6fd2a004 again from Matthew seems to contain a more recent version of the work.

Unfortunately, intel_backlight isn't doing anything on my board anymore.

Which steps would you recommend to help me find and resolve the issue?

Thanks for the help!
/jfd


FYI, here's the patch I had applied onto v2.6.37:

From: Matthew Garrett <mjg@redhat.com>
Date: Fri, 19 Nov 2010 15:53:53 +0000
Subject: [PATCH 1/2] i915: Add native backlight control (tweaked by JFD to
make compile)

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 <mjg@redhat.com>
Cc: intel-gfx <intel-gfx@lists.freedesktop.org>
---
drivers/gpu/drm/i915/i915_drv.h       |    4 ++
drivers/gpu/drm/i915/intel_dp.c       |    7 +++
drivers/gpu/drm/i915/intel_drv.h      |    2 +
drivers/gpu/drm/i915/intel_lvds.c     |    5 ++
drivers/gpu/drm/i915/intel_opregion.c |    1 -
drivers/gpu/drm/i915/intel_panel.c    |   66 +++++++++++++++++++++++++++++++++
6 files changed, 84 insertions(+), 1 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 409826d..9edf650 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -36,6 +36,7 @@
#include <linux/io-mapping.h>
#include <linux/i2c.h>
#include <drm/intel-gtt.h>
+#include <linux/backlight.h>

/* General customization:
 */
@@ -679,6 +680,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;

	bool mchbar_need_disable;

@@ -707,6 +709,8 @@ typedef struct drm_i915_private {

	/* list of fbdev register on this device */
	struct intel_fbdev *fbdev;
+
+	struct backlight_device *backlight;
} drm_i915_private_t;

/** driver private structure attached to each drm_gem_object */
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 864417c..2c114e0 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1655,6 +1655,11 @@ done:
static void
intel_dp_destroy (struct drm_connector *connector)
{
+	struct drm_device *dev = connector->dev;
+
+	if (intel_dpd_is_edp(dev))
+		intel_panel_backlight_destroy(dev);
+
	drm_sysfs_connector_remove(connector);
	drm_connector_cleanup(connector);
	kfree(connector);
@@ -1884,6 +1889,8 @@ intel_dp_init(struct drm_device *dev, int output_reg)
					DRM_MODE_TYPE_PREFERRED;
			}
		}
+		dev_priv->int_edp_connector = connector;
+		intel_panel_backlight_setup(dev);
	}

	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 e52c612..6f55e81 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -256,6 +256,8 @@ 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);
+extern int intel_panel_backlight_setup(struct drm_device *dev);
+extern void intel_panel_backlight_destroy(struct drm_device *dev);

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 25bcedf..ae1b5e3 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -579,6 +579,8 @@ static void intel_lvds_destroy(struct drm_connector *connector)
	struct drm_device *dev = connector->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;

+	intel_panel_backlight_destroy(dev);
+
	if (dev_priv->lid_notifier.notifier_call)
		acpi_lid_notifier_unregister(&dev_priv->lid_notifier);
	drm_sysfs_connector_remove(connector);
@@ -1036,6 +1038,9 @@ out:
	/* keep the LVDS connector */
	dev_priv->int_lvds_connector = connector;
	drm_sysfs_connector_add(connector);
+
+	intel_panel_backlight_setup(dev);
+
	return true;

failed:
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index 9b0d9a8..bf79c02 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -224,7 +224,6 @@ void intel_opregion_asle_intr(struct drm_device *dev)
	asle->aslc = asle_stat;
}

-/* Only present on Ironlake+ */
void intel_opregion_gse_intr(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index 92ff8f3..eec0f79 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -218,3 +218,69 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 level)
		tmp &= ~BACKLIGHT_DUTY_CYCLE_MASK;
	I915_WRITE(BLC_PWM_CTL, tmp | level);
}
+
+#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE
+static int intel_panel_update_status(struct backlight_device *bd)
+{
+	struct drm_device *dev = 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 = bl_get_data(bd);
+	return intel_panel_get_backlight(dev);
+}
+
+static const struct backlight_ops intel_panel_bl_ops = {
+	.update_status = intel_panel_update_status,
+	.get_brightness = intel_panel_get_brightness,
+};
+
+int intel_panel_backlight_setup(struct drm_device *dev)
+{
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	struct backlight_properties props;
+	struct drm_connector *connector;
+
+	if (dev_priv->int_lvds_connector)
+		connector = dev_priv->int_lvds_connector;
+	else if (dev_priv->int_edp_connector)
+		connector = dev_priv->int_edp_connector;
+	else
+		return -ENODEV;
+
+	props.max_brightness = intel_panel_get_max_backlight(dev);
+	dev_priv->backlight =
+		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 = NULL;
+		return -ENODEV;
+	}
+	dev_priv->backlight->props.brightness = intel_panel_get_backlight(dev);
+	return 0;
+}
+
+void intel_panel_backlight_destroy(struct drm_device *dev)
+{
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	if (dev_priv->backlight)
+		backlight_device_unregister(dev_priv->backlight);
+}
+#else
+int intel_panel_backlight_setup(struct drm_device *dev)
+{
+	return 0;
+}
+
+void intel_panel_backlight_destroy(struct drm_device *dev)
+{
+	return;
+}
+#endif
-- 
1.7.6.1

                 reply	other threads:[~2011-09-07 14:29 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=FD98F2BC-8D46-4EF3-A151-A9006F122B85@gmail.com \
    --to=jeff.dagenais@gmail.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=mjg@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.