# Description: Add support for smartdimmer backlight control for GeForce 7/8/9 based Sony laptops.
# Ubuntu: https://bugs.launchpad.net/bugs/277589
# Upstream: http://lists.freedesktop.org/pipermail/hal/2009-January/012858.html (rejected, should be fixed in kernel)
Index: hal-0.5.13/fdi/policy/10osvendor/10-sony-laptop-brightness.fdi
===================================================================
--- /dev/null
+++ hal-0.5.13/fdi/policy/10osvendor/10-sony-laptop-brightness.fdi
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deviceinfo version="0.2">
+
+  <!-- Brightness of LCDs on nVidia GeForce 7/8/9-based Sony laptops is
+       currently handled with smartdimmer, a userspace tool to poke at
+       the video card directly.  Handle brightness change requests using
+       a hardware-specific laptop_panel access method.
+       See https://bugs.launchpad.net/bugs/277589 for details. -->
+  <device>
+    <match key="info.category" string="laptop_panel">
+      <match key="/org/freedesktop/Hal/devices/computer:system.chassis.manufacturer" string="Sony Corporation">
+        <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.vendor" int="0x10de"> <!-- nVidia Corporation -->
+
+	  <!-- 0098 G70 [GeForce Go 7800] -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0098">
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+	  <!-- 0099 G70 [GeForce Go 7800 GTX] -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0099">
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+	  <!-- 00c8  NV41.8 [GeForce Go 6800] -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x00c8">
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+	  <!-- 00c9  NV41.9 [GeForce Go 6800 Ultra] -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x00c9">
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+	  <!-- 0144  NV43 [GeForce Go 6600] -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0144">
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+	  <!--  0146  NV43 [Geforce Go 6600TE/6200TE] -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0146">
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 0148  NV43 [GeForce Go 6600] -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0148" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 0149  NV43 [GeForce Go 6600 GT] -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0149" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 0164  NV44 [GeForce Go 6200] -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0164" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 0166  NV43 [GeForce Go 6400] -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0166" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 0167  NV43 [GeForce Go 6200/6400] -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0167" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 0168  NV43 [GeForce Go 6200/6400] -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0168" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 01d6  GeForce Go 7200 -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x01d6" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 01d7  G72M [Quadro NVS 110M/GeForce Go 7300] -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x01d7" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 01d8  G72M [GeForce Go 7400] -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x01d8" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 0247  MCP51 PCI-X GeForce Go 6100 -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0247" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 0297  GeForce Go 7950 GTX -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0297" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 0298  GeForce Go 7900 GS -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0298" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 0299  GeForce Go 7900 GTX -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0299" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 0397  GeForce Go 7700 -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0397" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 0398  G70 [GeForce Go 7600] -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0398" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 0399  GeForce Go 7600 GT -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x0399" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+          <!-- 039b  GeForce Go 7900 SE -->
+          <match key="/org/freedesktop/Hal/devices/computer:system.hardware.primary_video.product" int="0x039b" >\n
+            <merge key="laptop_panel.num_levels" type="int">86</merge>
+            <merge key="laptop_panel.access_method" type="string">sony-nvidia</merge>
+          </match>
+
+        </match>
+      </match>
+    </match>
+  </device>
+  <device>
+    <match key="info.category" string="laptop_panel">
+      <match key="laptop_panel.access_method" string="sony-nvidia">
+        <remove key="info.addons" type="strlist"></remove>
+
+        <append key="info.interfaces" type="strlist">org.freedesktop.Hal.Device.LaptopPanel</append>
+
+        <append key="org.freedesktop.Hal.Device.LaptopPanel.method_names" type="strlist">SetBrightness</append>
+        <append key="org.freedesktop.Hal.Device.LaptopPanel.method_signatures" type="strlist">i</append>
+        <append key="org.freedesktop.Hal.Device.LaptopPanel.method_argnames" type="strlist">brightness_value</append>
+        <append key="org.freedesktop.Hal.Device.LaptopPanel.method_execpaths" type="strlist">hal-system-lcd-set-brightness</append>
+
+        <append key="org.freedesktop.Hal.Device.LaptopPanel.method_names" type="strlist">GetBrightness</append>
+        <append key="org.freedesktop.Hal.Device.LaptopPanel.method_signatures" type="strlist"></append>
+        <append key="org.freedesktop.Hal.Device.LaptopPanel.method_argnames" type="strlist"></append>
+        <append key="org.freedesktop.Hal.Device.LaptopPanel.method_execpaths" type="strlist">hal-system-lcd-get-brightness</append>
+      </match>
+    </match>
+  </device>
+</deviceinfo>
Index: hal-0.5.13/fdi/policy/10osvendor/Makefile.am
===================================================================
--- hal-0.5.13.orig/fdi/policy/10osvendor/Makefile.am
+++ hal-0.5.13/fdi/policy/10osvendor/Makefile.am
@@ -8,6 +8,7 @@
 	10-leds.fdi			\
 	10-power-mgmt-policy.fdi	\
 	10-rfkill-switch.fdi		\
+	10-sony-laptop-brightness.fdi	\
 	10-tabletPCs.fdi		\
 	10-x11-input.fdi		\
 	15-storage-luks.fdi		\
Index: hal-0.5.13/fdi/policy/10osvendor/Makefile.in
===================================================================
--- hal-0.5.13.orig/fdi/policy/10osvendor/Makefile.in
+++ hal-0.5.13/fdi/policy/10osvendor/Makefile.in
@@ -58,7 +58,7 @@
 DIST_SOURCES =
 am__dist_fdi_DATA_DIST = 10-input-policy.fdi 10-dockstation.fdi \
 	10-laptop-panel-mgmt-policy.fdi 10-leds.fdi \
-	10-power-mgmt-policy.fdi 10-rfkill-switch.fdi 10-tabletPCs.fdi \
+	10-power-mgmt-policy.fdi 10-rfkill-switch.fdi 10-sony-laptop-brightness.fdi 10-tabletPCs.fdi \
 	10-x11-input.fdi 15-storage-luks.fdi 20-storage-methods.fdi \
 	30-wol.fdi 10-keymap.fdi 10-macbookpro-utils.fdi \
 	10-macbook-backlight.fdi 10-imac-backlight.fdi 10-cpufreq.fdi \
@@ -236,7 +236,7 @@
 fdidir = $(datadir)/hal/fdi/policy/10osvendor
 dist_fdi_DATA = 10-input-policy.fdi 10-dockstation.fdi \
 	10-laptop-panel-mgmt-policy.fdi 10-leds.fdi \
-	10-power-mgmt-policy.fdi 10-rfkill-switch.fdi 10-tabletPCs.fdi \
+	10-power-mgmt-policy.fdi 10-rfkill-switch.fdi 10-sony-laptop-brightness.fdi 10-tabletPCs.fdi \
 	10-x11-input.fdi 15-storage-luks.fdi 20-storage-methods.fdi \
 	30-wol.fdi $(am__append_1) $(am__append_2) $(am__append_3) \
 	$(am__append_4) $(am__append_5) $(am__append_6) \
Index: hal-0.5.13/tools/linux/hal-system-lcd-get-brightness-linux
===================================================================
--- hal-0.5.13.orig/tools/linux/hal-system-lcd-get-brightness-linux
+++ hal-0.5.13/tools/linux/hal-system-lcd-get-brightness-linux
@@ -23,6 +23,15 @@
 		exit 1
 	fi
 	exit ${value}
+elif [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "sony-nvidia" ]; then
+	# smartdimmer -g
+	value=$(( $(smartdimmer -g | awk '{print $3;}') - 15 ))
+	if [ $? -ne 0 ]; then
+		echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2
+		echo "smartdimmer -g returned != 0" >&2
+		exit 1
+	fi
+	exit ${value}
 fi
 
 # Check for file existance and that it's readable
Index: hal-0.5.13/tools/linux/hal-system-lcd-set-brightness-linux
===================================================================
--- hal-0.5.13.orig/tools/linux/hal-system-lcd-set-brightness-linux
+++ hal-0.5.13/tools/linux/hal-system-lcd-set-brightness-linux
@@ -23,6 +23,15 @@
 		exit 1
 	fi
 	exit 0
+elif [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "sony-nvidia" ]; then
+	# -s  --set <level>	Set brightness level (15-100)
+	smartdimmer -s "$(( $value + 15 ))"
+	if [ $? -ne 0 ]; then
+		echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2
+		echo "smartdimmer -s returned != 0" >&2
+		exit 1
+	fi
+	exit 0
 fi
 
 # Check for file existance and that it's writable
