Merge branch 'thinkpad-acpi' into release

This commit is contained in:
Len Brown 2009-04-24 01:34:37 -04:00
Родитель 60cd8adc6b b57f7e7b83
Коммит 7b806016b1
2 изменённых файлов: 46 добавлений и 39 удалений

Просмотреть файл

@ -1,7 +1,7 @@
ThinkPad ACPI Extras Driver ThinkPad ACPI Extras Driver
Version 0.22 Version 0.23
November 23rd, 2008 April 10th, 2009
Borislav Deianov <borislav@users.sf.net> Borislav Deianov <borislav@users.sf.net>
Henrique de Moraes Holschuh <hmh@hmh.eng.br> Henrique de Moraes Holschuh <hmh@hmh.eng.br>

Просмотреть файл

@ -21,7 +21,7 @@
* 02110-1301, USA. * 02110-1301, USA.
*/ */
#define TPACPI_VERSION "0.22" #define TPACPI_VERSION "0.23"
#define TPACPI_SYSFS_VERSION 0x020300 #define TPACPI_SYSFS_VERSION 0x020300
/* /*
@ -303,11 +303,17 @@ static u32 dbg_level;
static struct workqueue_struct *tpacpi_wq; static struct workqueue_struct *tpacpi_wq;
enum led_status_t {
TPACPI_LED_OFF = 0,
TPACPI_LED_ON,
TPACPI_LED_BLINK,
};
/* Special LED class that can defer work */ /* Special LED class that can defer work */
struct tpacpi_led_classdev { struct tpacpi_led_classdev {
struct led_classdev led_classdev; struct led_classdev led_classdev;
struct work_struct work; struct work_struct work;
enum led_brightness new_brightness; enum led_status_t new_state;
unsigned int led; unsigned int led;
}; };
@ -2946,12 +2952,18 @@ static int hotkey_read(char *p)
return len; return len;
} }
static void hotkey_enabledisable_warn(void) static void hotkey_enabledisable_warn(bool enable)
{ {
tpacpi_log_usertask("procfs hotkey enable/disable"); tpacpi_log_usertask("procfs hotkey enable/disable");
WARN(1, TPACPI_WARN if (!WARN((tpacpi_lifecycle == TPACPI_LIFE_RUNNING || !enable),
TPACPI_WARN
"hotkey enable/disable functionality has been " "hotkey enable/disable functionality has been "
"removed from the driver. Hotkeys are always enabled.\n"); "removed from the driver. Hotkeys are always "
"enabled\n"))
printk(TPACPI_ERR
"Please remove the hotkey=enable module "
"parameter, it is deprecated. Hotkeys are always "
"enabled\n");
} }
static int hotkey_write(char *buf) static int hotkey_write(char *buf)
@ -2971,9 +2983,9 @@ static int hotkey_write(char *buf)
res = 0; res = 0;
while ((cmd = next_cmd(&buf))) { while ((cmd = next_cmd(&buf))) {
if (strlencmp(cmd, "enable") == 0) { if (strlencmp(cmd, "enable") == 0) {
hotkey_enabledisable_warn(); hotkey_enabledisable_warn(1);
} else if (strlencmp(cmd, "disable") == 0) { } else if (strlencmp(cmd, "disable") == 0) {
hotkey_enabledisable_warn(); hotkey_enabledisable_warn(0);
res = -EPERM; res = -EPERM;
} else if (strlencmp(cmd, "reset") == 0) { } else if (strlencmp(cmd, "reset") == 0) {
mask = hotkey_orig_mask; mask = hotkey_orig_mask;
@ -4207,7 +4219,7 @@ static void light_set_status_worker(struct work_struct *work)
container_of(work, struct tpacpi_led_classdev, work); container_of(work, struct tpacpi_led_classdev, work);
if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING)) if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING))
light_set_status((data->new_brightness != LED_OFF)); light_set_status((data->new_state != TPACPI_LED_OFF));
} }
static void light_sysfs_set(struct led_classdev *led_cdev, static void light_sysfs_set(struct led_classdev *led_cdev,
@ -4217,7 +4229,8 @@ static void light_sysfs_set(struct led_classdev *led_cdev,
container_of(led_cdev, container_of(led_cdev,
struct tpacpi_led_classdev, struct tpacpi_led_classdev,
led_classdev); led_classdev);
data->new_brightness = brightness; data->new_state = (brightness != LED_OFF) ?
TPACPI_LED_ON : TPACPI_LED_OFF;
queue_work(tpacpi_wq, &data->work); queue_work(tpacpi_wq, &data->work);
} }
@ -4724,12 +4737,6 @@ enum { /* For TPACPI_LED_OLD */
TPACPI_LED_EC_HLMS = 0x0e, /* EC reg to select led to command */ TPACPI_LED_EC_HLMS = 0x0e, /* EC reg to select led to command */
}; };
enum led_status_t {
TPACPI_LED_OFF = 0,
TPACPI_LED_ON,
TPACPI_LED_BLINK,
};
static enum led_access_mode led_supported; static enum led_access_mode led_supported;
TPACPI_HANDLE(led, ec, "SLED", /* 570 */ TPACPI_HANDLE(led, ec, "SLED", /* 570 */
@ -4841,23 +4848,13 @@ static int led_set_status(const unsigned int led,
return rc; return rc;
} }
static void led_sysfs_set_status(unsigned int led,
enum led_brightness brightness)
{
led_set_status(led,
(brightness == LED_OFF) ?
TPACPI_LED_OFF :
(tpacpi_led_state_cache[led] == TPACPI_LED_BLINK) ?
TPACPI_LED_BLINK : TPACPI_LED_ON);
}
static void led_set_status_worker(struct work_struct *work) static void led_set_status_worker(struct work_struct *work)
{ {
struct tpacpi_led_classdev *data = struct tpacpi_led_classdev *data =
container_of(work, struct tpacpi_led_classdev, work); container_of(work, struct tpacpi_led_classdev, work);
if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING)) if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING))
led_sysfs_set_status(data->led, data->new_brightness); led_set_status(data->led, data->new_state);
} }
static void led_sysfs_set(struct led_classdev *led_cdev, static void led_sysfs_set(struct led_classdev *led_cdev,
@ -4866,7 +4863,13 @@ static void led_sysfs_set(struct led_classdev *led_cdev,
struct tpacpi_led_classdev *data = container_of(led_cdev, struct tpacpi_led_classdev *data = container_of(led_cdev,
struct tpacpi_led_classdev, led_classdev); struct tpacpi_led_classdev, led_classdev);
data->new_brightness = brightness; if (brightness == LED_OFF)
data->new_state = TPACPI_LED_OFF;
else if (tpacpi_led_state_cache[data->led] != TPACPI_LED_BLINK)
data->new_state = TPACPI_LED_ON;
else
data->new_state = TPACPI_LED_BLINK;
queue_work(tpacpi_wq, &data->work); queue_work(tpacpi_wq, &data->work);
} }
@ -4884,7 +4887,7 @@ static int led_sysfs_blink_set(struct led_classdev *led_cdev,
} else if ((*delay_on != 500) || (*delay_off != 500)) } else if ((*delay_on != 500) || (*delay_off != 500))
return -EINVAL; return -EINVAL;
data->new_brightness = TPACPI_LED_BLINK; data->new_state = TPACPI_LED_BLINK;
queue_work(tpacpi_wq, &data->work); queue_work(tpacpi_wq, &data->work);
return 0; return 0;
@ -7857,6 +7860,15 @@ static int __init thinkpad_acpi_module_init(void)
MODULE_ALIAS(TPACPI_DRVR_SHORTNAME); MODULE_ALIAS(TPACPI_DRVR_SHORTNAME);
/*
* This will autoload the driver in almost every ThinkPad
* in widespread use.
*
* Only _VERY_ old models, like the 240, 240x and 570 lack
* the HKEY event interface.
*/
MODULE_DEVICE_TABLE(acpi, ibm_htk_device_ids);
/* /*
* DMI matching for module autoloading * DMI matching for module autoloading
* *
@ -7869,18 +7881,13 @@ MODULE_ALIAS(TPACPI_DRVR_SHORTNAME);
#define IBM_BIOS_MODULE_ALIAS(__type) \ #define IBM_BIOS_MODULE_ALIAS(__type) \
MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW*") MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW*")
/* Non-ancient thinkpads */
MODULE_ALIAS("dmi:bvnIBM:*:svnIBM:*:pvrThinkPad*:rvnIBM:*");
MODULE_ALIAS("dmi:bvnLENOVO:*:svnLENOVO:*:pvrThinkPad*:rvnLENOVO:*");
/* Ancient thinkpad BIOSes have to be identified by /* Ancient thinkpad BIOSes have to be identified by
* BIOS type or model number, and there are far less * BIOS type or model number, and there are far less
* BIOS types than model numbers... */ * BIOS types than model numbers... */
IBM_BIOS_MODULE_ALIAS("I[BDHIMNOTWVYZ]"); IBM_BIOS_MODULE_ALIAS("I[MU]"); /* 570, 570e */
IBM_BIOS_MODULE_ALIAS("1[0368A-GIKM-PST]");
IBM_BIOS_MODULE_ALIAS("K[UX-Z]");
MODULE_AUTHOR("Borislav Deianov, Henrique de Moraes Holschuh"); MODULE_AUTHOR("Borislav Deianov <borislav@users.sf.net>");
MODULE_AUTHOR("Henrique de Moraes Holschuh <hmh@hmh.eng.br>");
MODULE_DESCRIPTION(TPACPI_DESC); MODULE_DESCRIPTION(TPACPI_DESC);
MODULE_VERSION(TPACPI_VERSION); MODULE_VERSION(TPACPI_VERSION);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");