1/* 2 * Backlight Driver for Frontpath ProGear HX1050+ 3 * 4 * Copyright (c) 2006 Marcin Juszkiewicz 5 * 6 * Based on Progear LCD driver by M Schacht 7 * <mschacht at alumni dot washington dot edu> 8 * 9 * Based on Sharp's Corgi Backlight Driver 10 * Based on Backlight Driver for HP Jornada 680 11 * 12 * This program is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU General Public License version 2 as 14 * published by the Free Software Foundation. 15 * 16 */ 17 18#include <linux/module.h> 19#include <linux/kernel.h> 20#include <linux/init.h> 21#include <linux/platform_device.h> 22#include <linux/mutex.h> 23#include <linux/fb.h> 24#include <linux/backlight.h> 25#include <linux/pci.h> 26 27#define PMU_LPCR 0xB0 28#define SB_MPS1 0x61 29#define HW_LEVEL_MAX 0x77 30#define HW_LEVEL_MIN 0x4f 31 32static struct pci_dev *pmu_dev = NULL; 33static struct pci_dev *sb_dev = NULL; 34 35static int progearbl_set_intensity(struct backlight_device *bd) 36{ 37 int intensity = bd->props.brightness; 38 39 if (bd->props.power != FB_BLANK_UNBLANK) 40 intensity = 0; 41 if (bd->props.fb_blank != FB_BLANK_UNBLANK) 42 intensity = 0; 43 44 pci_write_config_byte(pmu_dev, PMU_LPCR, intensity + HW_LEVEL_MIN); 45 46 return 0; 47} 48 49static int progearbl_get_intensity(struct backlight_device *bd) 50{ 51 u8 intensity; 52 pci_read_config_byte(pmu_dev, PMU_LPCR, &intensity); 53 54 return intensity - HW_LEVEL_MIN; 55} 56 57static const struct backlight_ops progearbl_ops = { 58 .get_brightness = progearbl_get_intensity, 59 .update_status = progearbl_set_intensity, 60}; 61 62static int progearbl_probe(struct platform_device *pdev) 63{ 64 struct backlight_properties props; 65 u8 temp; 66 struct backlight_device *progear_backlight_device; 67 int ret; 68 69 pmu_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, NULL); 70 if (!pmu_dev) { 71 printk("ALI M7101 PMU not found.\n"); 72 return -ENODEV; 73 } 74 75 sb_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL); 76 if (!sb_dev) { 77 printk("ALI 1533 SB not found.\n"); 78 ret = -ENODEV; 79 goto put_pmu; 80 } 81 82 /* Set SB_MPS1 to enable brightness control. */ 83 pci_read_config_byte(sb_dev, SB_MPS1, &temp); 84 pci_write_config_byte(sb_dev, SB_MPS1, temp | 0x20); 85 86 memset(&props, 0, sizeof(struct backlight_properties)); 87 props.max_brightness = HW_LEVEL_MAX - HW_LEVEL_MIN; 88 progear_backlight_device = backlight_device_register("progear-bl", 89 &pdev->dev, NULL, 90 &progearbl_ops, 91 &props); 92 if (IS_ERR(progear_backlight_device)) { 93 ret = PTR_ERR(progear_backlight_device); 94 goto put_sb; 95 } 96 97 platform_set_drvdata(pdev, progear_backlight_device); 98 99 progear_backlight_device->props.power = FB_BLANK_UNBLANK; 100 progear_backlight_device->props.brightness = HW_LEVEL_MAX - HW_LEVEL_MIN; 101 progearbl_set_intensity(progear_backlight_device); 102 103 return 0; 104put_sb: 105 pci_dev_put(sb_dev); 106put_pmu: 107 pci_dev_put(pmu_dev); 108 return ret; 109} 110 111static int progearbl_remove(struct platform_device *pdev) 112{ 113 struct backlight_device *bd = platform_get_drvdata(pdev); 114 backlight_device_unregister(bd); 115 116 return 0; 117} 118 119static struct platform_driver progearbl_driver = { 120 .probe = progearbl_probe, 121 .remove = progearbl_remove, 122 .driver = { 123 .name = "progear-bl", 124 }, 125}; 126 127static struct platform_device *progearbl_device; 128 129static int __init progearbl_init(void) 130{ 131 int ret = platform_driver_register(&progearbl_driver); 132 133 if (ret) 134 return ret; 135 progearbl_device = platform_device_register_simple("progear-bl", -1, 136 NULL, 0); 137 if (IS_ERR(progearbl_device)) { 138 platform_driver_unregister(&progearbl_driver); 139 return PTR_ERR(progearbl_device); 140 } 141 142 return 0; 143} 144 145static void __exit progearbl_exit(void) 146{ 147 pci_dev_put(pmu_dev); 148 pci_dev_put(sb_dev); 149 150 platform_device_unregister(progearbl_device); 151 platform_driver_unregister(&progearbl_driver); 152} 153 154module_init(progearbl_init); 155module_exit(progearbl_exit); 156 157MODULE_AUTHOR("Marcin Juszkiewicz <linux@hrw.one.pl>"); 158MODULE_DESCRIPTION("ProGear Backlight Driver"); 159MODULE_LICENSE("GPL"); 160