Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.29-rc4 148 lines 3.8 kB view raw
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 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 u8 temp; 65 struct backlight_device *progear_backlight_device; 66 67 pmu_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, NULL); 68 if (!pmu_dev) { 69 printk("ALI M7101 PMU not found.\n"); 70 return -ENODEV; 71 } 72 73 sb_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL); 74 if (!sb_dev) { 75 printk("ALI 1533 SB not found.\n"); 76 pci_dev_put(pmu_dev); 77 return -ENODEV; 78 } 79 80 /* Set SB_MPS1 to enable brightness control. */ 81 pci_read_config_byte(sb_dev, SB_MPS1, &temp); 82 pci_write_config_byte(sb_dev, SB_MPS1, temp | 0x20); 83 84 progear_backlight_device = backlight_device_register("progear-bl", 85 &pdev->dev, NULL, 86 &progearbl_ops); 87 if (IS_ERR(progear_backlight_device)) 88 return PTR_ERR(progear_backlight_device); 89 90 platform_set_drvdata(pdev, progear_backlight_device); 91 92 progear_backlight_device->props.power = FB_BLANK_UNBLANK; 93 progear_backlight_device->props.brightness = HW_LEVEL_MAX - HW_LEVEL_MIN; 94 progear_backlight_device->props.max_brightness = HW_LEVEL_MAX - HW_LEVEL_MIN; 95 progearbl_set_intensity(progear_backlight_device); 96 97 return 0; 98} 99 100static int progearbl_remove(struct platform_device *pdev) 101{ 102 struct backlight_device *bd = platform_get_drvdata(pdev); 103 backlight_device_unregister(bd); 104 105 return 0; 106} 107 108static struct platform_driver progearbl_driver = { 109 .probe = progearbl_probe, 110 .remove = progearbl_remove, 111 .driver = { 112 .name = "progear-bl", 113 }, 114}; 115 116static struct platform_device *progearbl_device; 117 118static int __init progearbl_init(void) 119{ 120 int ret = platform_driver_register(&progearbl_driver); 121 122 if (ret) 123 return ret; 124 progearbl_device = platform_device_register_simple("progear-bl", -1, 125 NULL, 0); 126 if (IS_ERR(progearbl_device)) { 127 platform_driver_unregister(&progearbl_driver); 128 return PTR_ERR(progearbl_device); 129 } 130 131 return 0; 132} 133 134static void __exit progearbl_exit(void) 135{ 136 pci_dev_put(pmu_dev); 137 pci_dev_put(sb_dev); 138 139 platform_device_unregister(progearbl_device); 140 platform_driver_unregister(&progearbl_driver); 141} 142 143module_init(progearbl_init); 144module_exit(progearbl_exit); 145 146MODULE_AUTHOR("Marcin Juszkiewicz <linux@hrw.one.pl>"); 147MODULE_DESCRIPTION("ProGear Backlight Driver"); 148MODULE_LICENSE("GPL");