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.

lis3lv02d: merge with leds hp disk

Move the second part of the HP laptop disk protection functionality (a red
led) to the same driver. From a purely Linux developer's point of view,
the led and the accelerometer have nothing related. However, they
correspond to the same ACPI functionality, and so will always be used
together, moreover as they share the same ACPI PNP alias, there is no
other simple to allow to have same loaded at the same time if they are not
in the same module. Also make it requires the led class to compile and
update the Kconfig text.

Signed-off-by: Pavel Machek <pavel@suse.cz>
Signed-off-by: Eric Piel <eric.piel@tremplin-utc.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Eric Piel and committed by
Linus Torvalds
9e0c7978 5b019e99

+52 -150
+11 -3
drivers/hwmon/Kconfig
··· 861 861 config SENSORS_LIS3LV02D 862 862 tristate "STMicroeletronics LIS3LV02Dx three-axis digital accelerometer" 863 863 depends on ACPI && INPUT 864 + select NEW_LEDS 865 + select LEDS_CLASS 864 866 default n 865 867 help 866 868 This driver provides support for the LIS3LV02Dx accelerometer. In ··· 874 872 /sys/devices/platform/lis3lv02d. 875 873 876 874 This driver also provides an absolute input class device, allowing 877 - the laptop to act as a pinball machine-esque joystick. 875 + the laptop to act as a pinball machine-esque joystick. On HP laptops, 876 + if the led infrastructure is activated, support for a led indicating 877 + disk protection will be provided as hp:red:hddprotection. 878 878 879 - This driver can also be built as a module. If so, the module 880 - will be called lis3lv02d. 879 + This driver can also be built as modules. If so, the core module 880 + will be called lis3lv02d and a specific module for HP laptops will be 881 + called hp_accel. 882 + 883 + Say Y here if you have an applicable laptop and want to experience 884 + the awesome power of lis3lv02d. 881 885 882 886 config SENSORS_APPLESMC 883 887 tristate "Apple SMC (Motion sensor, light sensor, keyboard backlight)"
+41 -2
drivers/hwmon/hp_accel.c
··· 36 36 #include <linux/freezer.h> 37 37 #include <linux/version.h> 38 38 #include <linux/uaccess.h> 39 + #include <linux/leds.h> 39 40 #include <acpi/acpi_drivers.h> 40 41 #include <asm/atomic.h> 41 42 #include "lis3lv02d.h" ··· 155 154 */ 156 155 }; 157 156 157 + static acpi_status hpled_acpi_write(acpi_handle handle, int reg) 158 + { 159 + unsigned long long ret; /* Not used when writing */ 160 + union acpi_object in_obj[1]; 161 + struct acpi_object_list args = { 1, in_obj }; 162 + 163 + in_obj[0].type = ACPI_TYPE_INTEGER; 164 + in_obj[0].integer.value = reg; 165 + 166 + return acpi_evaluate_integer(handle, "ALED", &args, &ret); 167 + } 168 + 169 + static void hpled_set(struct led_classdev *led_cdev, 170 + enum led_brightness value) 171 + { 172 + hpled_acpi_write(adev.device->handle, !!value); 173 + } 174 + 175 + static struct led_classdev hpled_led = { 176 + .name = "hp:red:hddprotection", 177 + .default_trigger = "none", 178 + .brightness_set = hpled_set, 179 + }; 158 180 159 181 static int lis3lv02d_add(struct acpi_device *device) 160 182 { 161 183 u8 val; 184 + int ret; 162 185 163 186 if (!device) 164 187 return -EINVAL; ··· 208 183 adev.ac = lis3lv02d_axis_normal; 209 184 } 210 185 211 - return lis3lv02d_init_device(&adev); 186 + ret = led_classdev_register(NULL, &hpled_led); 187 + if (ret) 188 + return ret; 189 + 190 + ret = lis3lv02d_init_device(&adev); 191 + if (ret) { 192 + led_classdev_unregister(&hpled_led); 193 + return ret; 194 + } 195 + 196 + return ret; 212 197 } 213 198 214 199 static int lis3lv02d_remove(struct acpi_device *device, int type) ··· 229 194 lis3lv02d_joystick_disable(); 230 195 lis3lv02d_poweroff(device->handle); 231 196 197 + led_classdev_unregister(&hpled_led); 198 + 232 199 return lis3lv02d_remove_fs(); 233 200 } 234 201 ··· 240 203 { 241 204 /* make sure the device is off when we suspend */ 242 205 lis3lv02d_poweroff(device->handle); 206 + led_classdev_suspend(&hpled_led); 243 207 return 0; 244 208 } 245 209 ··· 253 215 else 254 216 lis3lv02d_poweroff(device->handle); 255 217 mutex_unlock(&adev.lock); 218 + led_classdev_resume(&hpled_led); 256 219 return 0; 257 220 } 258 221 #else ··· 295 256 acpi_bus_unregister_driver(&lis3lv02d_driver); 296 257 } 297 258 298 - MODULE_DESCRIPTION("Glue between LIS3LV02Dx and HP ACPI BIOS"); 259 + MODULE_DESCRIPTION("Glue between LIS3LV02Dx and HP ACPI BIOS and support for disk protection LED."); 299 260 MODULE_AUTHOR("Yan Burman, Eric Piel, Pavel Machek"); 300 261 MODULE_LICENSE("GPL"); 301 262
-7
drivers/leds/Kconfig
··· 119 119 outputs. To be useful the particular board must have LEDs 120 120 and they must be connected to the GPIO lines. 121 121 122 - config LEDS_HP_DISK 123 - tristate "LED Support for disk protection LED on HP notebooks" 124 - depends on LEDS_CLASS && ACPI 125 - help 126 - This option enable support for disk protection LED, found on 127 - newer HP notebooks. 128 - 129 122 config LEDS_CLEVO_MAIL 130 123 tristate "Mail LED on Clevo notebook (EXPERIMENTAL)" 131 124 depends on LEDS_CLASS && X86 && SERIO_I8042 && DMI && EXPERIMENTAL
-1
drivers/leds/Makefile
··· 23 23 obj-$(CONFIG_LEDS_FSG) += leds-fsg.o 24 24 obj-$(CONFIG_LEDS_PCA955X) += leds-pca955x.o 25 25 obj-$(CONFIG_LEDS_DA903X) += leds-da903x.o 26 - obj-$(CONFIG_LEDS_HP_DISK) += leds-hp-disk.o 27 26 obj-$(CONFIG_LEDS_WM8350) += leds-wm8350.o 28 27 29 28 # LED Triggers
-137
drivers/leds/leds-hp-disk.c
··· 1 - /* 2 - * leds-hp-disk.c - driver for HP "hard disk protection" LED 3 - * 4 - * Copyright (C) 2008 Pavel Machek 5 - * 6 - * This program is free software; you can redistribute it and/or modify 7 - * it under the terms of the GNU General Public License as published by 8 - * the Free Software Foundation; either version 2 of the License, or 9 - * (at your option) any later version. 10 - * 11 - * This program is distributed in the hope that it will be useful, 12 - * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 - * GNU General Public License for more details. 15 - * 16 - * You should have received a copy of the GNU General Public License 17 - * along with this program; if not, write to the Free Software 18 - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 - */ 20 - 21 - #include <linux/kernel.h> 22 - #include <linux/init.h> 23 - #include <linux/dmi.h> 24 - #include <linux/module.h> 25 - #include <linux/types.h> 26 - #include <linux/platform_device.h> 27 - #include <linux/interrupt.h> 28 - #include <linux/input.h> 29 - #include <linux/kthread.h> 30 - #include <linux/leds.h> 31 - #include <acpi/acpi_drivers.h> 32 - 33 - #define DRIVER_NAME "leds-hp-disk" 34 - #define ACPI_MDPS_CLASS "led" 35 - 36 - /* For automatic insertion of the module */ 37 - static struct acpi_device_id hpled_device_ids[] = { 38 - {"HPQ0004", 0}, /* HP Mobile Data Protection System PNP */ 39 - {"", 0}, 40 - }; 41 - MODULE_DEVICE_TABLE(acpi, hpled_device_ids); 42 - 43 - struct acpi_hpled { 44 - struct acpi_device *device; /* The ACPI device */ 45 - }; 46 - 47 - static struct acpi_hpled adev; 48 - 49 - static acpi_status hpled_acpi_write(acpi_handle handle, int reg) 50 - { 51 - unsigned long long ret; /* Not used when writing */ 52 - union acpi_object in_obj[1]; 53 - struct acpi_object_list args = { 1, in_obj }; 54 - 55 - in_obj[0].type = ACPI_TYPE_INTEGER; 56 - in_obj[0].integer.value = reg; 57 - 58 - return acpi_evaluate_integer(handle, "ALED", &args, &ret); 59 - } 60 - 61 - static void hpled_set(struct led_classdev *led_cdev, 62 - enum led_brightness value) 63 - { 64 - hpled_acpi_write(adev.device->handle, !!value); 65 - } 66 - 67 - static struct led_classdev hpled_led = { 68 - .name = "hp:red:hddprotection", 69 - .default_trigger = "heartbeat", 70 - .brightness_set = hpled_set, 71 - .flags = LED_CORE_SUSPENDRESUME, 72 - }; 73 - 74 - static int hpled_add(struct acpi_device *device) 75 - { 76 - int ret; 77 - 78 - if (!device) 79 - return -EINVAL; 80 - 81 - adev.device = device; 82 - strcpy(acpi_device_name(device), DRIVER_NAME); 83 - strcpy(acpi_device_class(device), ACPI_MDPS_CLASS); 84 - device->driver_data = &adev; 85 - 86 - ret = led_classdev_register(NULL, &hpled_led); 87 - return ret; 88 - } 89 - 90 - static int hpled_remove(struct acpi_device *device, int type) 91 - { 92 - if (!device) 93 - return -EINVAL; 94 - 95 - led_classdev_unregister(&hpled_led); 96 - return 0; 97 - } 98 - 99 - 100 - 101 - static struct acpi_driver leds_hp_driver = { 102 - .name = DRIVER_NAME, 103 - .class = ACPI_MDPS_CLASS, 104 - .ids = hpled_device_ids, 105 - .ops = { 106 - .add = hpled_add, 107 - .remove = hpled_remove, 108 - } 109 - }; 110 - 111 - static int __init hpled_init_module(void) 112 - { 113 - int ret; 114 - 115 - if (acpi_disabled) 116 - return -ENODEV; 117 - 118 - ret = acpi_bus_register_driver(&leds_hp_driver); 119 - if (ret < 0) 120 - return ret; 121 - 122 - printk(KERN_INFO DRIVER_NAME " driver loaded.\n"); 123 - 124 - return 0; 125 - } 126 - 127 - static void __exit hpled_exit_module(void) 128 - { 129 - acpi_bus_unregister_driver(&leds_hp_driver); 130 - } 131 - 132 - MODULE_DESCRIPTION("Driver for HP disk protection LED"); 133 - MODULE_AUTHOR("Pavel Machek <pavel@suse.cz>"); 134 - MODULE_LICENSE("GPL"); 135 - 136 - module_init(hpled_init_module); 137 - module_exit(hpled_exit_module);