 +#define HW_LEVEL_MAX           0x77
 +#define HW_LEVEL_MIN           0x4f
 +
-+static int progearbl_intensity;
-+static struct backlight_properties progearbl_data;
-+static struct backlight_device *progear_backlight_device;
-+
 +static struct pci_dev *pmu_dev = NULL;
 +static struct pci_dev *sb_dev = NULL;
 +
-+static int progearbl_send_intensity(struct backlight_device *bd)
-+{
-+       int intensity = bd->props->brightness;
-+
-+       if (bd->props->power != FB_BLANK_UNBLANK)
-+               intensity = 0;
-+       if (bd->props->fb_blank != FB_BLANK_UNBLANK)
-+               intensity = 0;
-+
-+       pci_write_config_byte(pmu_dev, PMU_LPCR, intensity + HW_LEVEL_MIN);
-+
-+       progearbl_intensity = intensity;
-+
-+       return 0;
++static int progearbl_set_intensity(struct backlight_device *bd)
++{
++	int intensity = bd->props->brightness;
++
++	if (bd->props->power != FB_BLANK_UNBLANK)
++		intensity = 0;
++	if (bd->props->fb_blank != FB_BLANK_UNBLANK)
++		intensity = 0;
++
++	pci_write_config_byte(pmu_dev, PMU_LPCR, intensity + HW_LEVEL_MIN);
++
++	return 0;
 +}
 +
 +static int progearbl_get_intensity(struct backlight_device *bd)
 +{
-+       return progearbl_intensity;
-+}
-+
-+static int progearbl_set_intensity(struct backlight_device *bd)
-+{
-+       progearbl_send_intensity(progear_backlight_device);
-+
-+       return 0;
++	u8 intensity;
++	pci_read_config_byte(pmu_dev, PMU_LPCR, &intensity);
++
++	return intensity - HW_LEVEL_MIN;
 +}
 +
 +static struct backlight_properties progearbl_data = {
-+       .owner = THIS_MODULE,
-+       .get_brightness = progearbl_get_intensity,
-+       .update_status = progearbl_set_intensity,
++	.owner = THIS_MODULE,
++	.get_brightness = progearbl_get_intensity,
++	.update_status = progearbl_set_intensity,
 +};
 +
 +static int progearbl_probe(struct platform_device *pdev)
 +{
-+       u8 temp;
-+
-+       pmu_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, 0);
-+       if (!pmu_dev) {
-+               printk("ALI M7101 PMU not found.\n");
-+               return -ENODEV;
-+       }
-+
-+       sb_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, 0);
-+       if (!sb_dev) {
-+               printk("ALI 1533 SB not found.\n");
-+               pci_dev_put(pmu_dev);
-+               return -ENODEV;
-+       }
-+
-+       /*     Set SB_MPS1 to enable brightness control. */
-+       pci_read_config_byte(sb_dev, SB_MPS1, &temp);
-+       pci_write_config_byte(sb_dev, SB_MPS1, temp | 0x20);
-+
-+       progear_backlight_device = backlight_device_register("progear-bl",
-+			   &pdev->dev, NULL, &progearbl_data);
-+       if (IS_ERR(progear_backlight_device))
-+               return PTR_ERR(progear_backlight_device);
-+
-+       progearbl_data.power = FB_BLANK_UNBLANK;
-+       progearbl_data.brightness = HW_LEVEL_MAX - HW_LEVEL_MIN;
-+       progearbl_data.max_brightness = HW_LEVEL_MAX - HW_LEVEL_MIN;
-+       progearbl_send_intensity(progear_backlight_device);
-+
-+       return 0;
-+}
-+
-+static int progearbl_remove(struct platform_device *dev)
-+{
-+       backlight_device_unregister(progear_backlight_device);
-+
-+       return 0;
++	u8 temp;
++	struct backlight_device *progear_backlight_device;
++
++	pmu_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, 0);
++	if (!pmu_dev) {
++		printk("ALI M7101 PMU not found.\n");
++		return -ENODEV;
++	}
++
++	sb_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, 0);
++	if (!sb_dev) {
++		printk("ALI 1533 SB not found.\n");
++		pci_dev_put(pmu_dev);
++		return -ENODEV;
++	}
++
++	/*     Set SB_MPS1 to enable brightness control. */
++	pci_read_config_byte(sb_dev, SB_MPS1, &temp);
++	pci_write_config_byte(sb_dev, SB_MPS1, temp | 0x20);
++
++	progear_backlight_device = backlight_device_register("progear-bl",
++							     &pdev->dev, NULL,
++							     &progearbl_data);
++	if (IS_ERR(progear_backlight_device))
++		return PTR_ERR(progear_backlight_device);
++
++	platform_set_drvdata(pdev, progear_backlight_device);
++
++	progearbl_data.power = FB_BLANK_UNBLANK;
++	progearbl_data.brightness = HW_LEVEL_MAX - HW_LEVEL_MIN;
++	progearbl_data.max_brightness = HW_LEVEL_MAX - HW_LEVEL_MIN;
++	progearbl_set_intensity(progear_backlight_device);
++
++	return 0;
++}
++
++static int progearbl_remove(struct platform_device *pdev)
++{
++	struct backlight_device *bd = platform_get_drvdata(pdev);
++	backlight_device_unregister(bd);
++
++	return 0;
 +}
 +
 +static struct platform_driver progearbl_driver = {
-+       .probe = progearbl_probe,
-+       .remove = progearbl_remove,
-+       .driver = {
-+                  .name = "progear-bl",
-+                  },
++	.probe = progearbl_probe,
++	.remove = progearbl_remove,
++	.driver = {
++		   .name = "progear-bl",
++		   },
 +};
 +
 +static struct platform_device *progearbl_device;
 +
 +static int __init progearbl_init(void)
 +{
-+       int ret = platform_driver_register(&progearbl_driver);
-+       if (!ret) {
-+               progearbl_device = platform_device_alloc("progear-bl", -1);
-+               if (!progearbl_device)
-+                       return -ENOMEM;
-+
-+               ret = platform_device_add(progearbl_device);
-+
-+               if (ret) {
-+                       platform_device_put(progearbl_device);
-+                       platform_driver_unregister(&progearbl_driver);
-+               }
-+       }
-+       return ret;
++	int ret = platform_driver_register(&progearbl_driver);
++
++	if (!ret) {
++		progearbl_device = platform_device_alloc("progear-bl", -1);
++		if (!progearbl_device)
++			return -ENOMEM;
++
++		ret = platform_device_add(progearbl_device);
++
++		if (ret) {
++			platform_device_put(progearbl_device);
++			platform_driver_unregister(&progearbl_driver);
++		}
++	}
++
++	return ret;
 +}
 +
 +static void __exit progearbl_exit(void)
 +{
-+       pci_dev_put(pmu_dev);
-+       pci_dev_put(sb_dev);
-+
-+       platform_device_unregister(progearbl_device);
-+       platform_driver_unregister(&progearbl_driver);
++	pci_dev_put(pmu_dev);
++	pci_dev_put(sb_dev);
++
++	platform_device_unregister(progearbl_device);
++	platform_driver_unregister(&progearbl_driver);
 +}
 +
 +module_init(progearbl_init);

+MODULE_AUTHOR("Marcin Juszkiewicz <linux@hrw.one.pl>");
+MODULE_DESCRIPTION("ProGear Backlight Driver");
+MODULE_LICENSE("GPL");
Index: linux-2.6.20/drivers/video/backlight/Makefile
===================================================================
--- linux-2.6.20.orig/drivers/video/backlight/Makefile	2007-02-04 19:44:54.000000000 +0100
+++ linux-2.6.20/drivers/video/backlight/Makefile	2007-02-05 16:13:13.000000000 +0100
@@ -5,3 +5,4 @@
 obj-$(CONFIG_BACKLIGHT_CORGI)	+= corgi_bl.o
 obj-$(CONFIG_BACKLIGHT_HP680)	+= hp680_bl.o

Signed-Off-By: Marcin Juszkiewicz <openembedded@hrw.one.pl>

---
Patch follow kernel version 2.6.20

 Kconfig      |    8 +++
 Makefile     |    1 
 progear_bl.c |  154 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 163 insertions(+)

Index: git/drivers/video/backlight/Kconfig
===================================================================
--- git.orig/drivers/video/backlight/Kconfig	2006-12-29 17:31:36.511043439 +0100
+++ git/drivers/video/backlight/Kconfig	2007-02-07 08:57:31.020095845 +0100
@@ -66,3 +66,11 @@
 	  If you have a HP Jornada 680, say y to enable the
 	  backlight driver.
 
+config BACKLIGHT_PROGEAR
+       tristate "Frontpath ProGear Backlight Driver"
+       depends on BACKLIGHT_DEVICE && PCI && X86
+       default y
+       help
+         If you have a Frontpath ProGear say Y to enable the
+         backlight driver.
+
Index: git/drivers/video/backlight/progear_bl.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ git/drivers/video/backlight/progear_bl.c	2007-02-07 08:55:46.813993140 +0100
@@ -0,0 +1,154 @@
+/*
+ *  Backlight Driver for Frontpath ProGear HX1050+
+ *
