mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
Merge branches 'release' and 'video' into release
Conflicts: include/acpi/acpi_bus.h Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
commit
52b097fff8
3 changed files with 97 additions and 69 deletions
|
@ -109,6 +109,34 @@ static const struct file_operations acpi_system_event_ops = {
|
||||||
};
|
};
|
||||||
#endif /* CONFIG_ACPI_PROC_EVENT */
|
#endif /* CONFIG_ACPI_PROC_EVENT */
|
||||||
|
|
||||||
|
/* ACPI notifier chain */
|
||||||
|
BLOCKING_NOTIFIER_HEAD(acpi_chain_head);
|
||||||
|
|
||||||
|
int acpi_notifier_call_chain(struct acpi_device *dev, u32 type, u32 data)
|
||||||
|
{
|
||||||
|
struct acpi_bus_event event;
|
||||||
|
|
||||||
|
strcpy(event.device_class, dev->pnp.device_class);
|
||||||
|
strcpy(event.bus_id, dev->pnp.bus_id);
|
||||||
|
event.type = type;
|
||||||
|
event.data = data;
|
||||||
|
return (blocking_notifier_call_chain(&acpi_chain_head, 0, (void *)&event)
|
||||||
|
== NOTIFY_BAD) ? -EINVAL : 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(acpi_notifier_call_chain);
|
||||||
|
|
||||||
|
int register_acpi_notifier(struct notifier_block *nb)
|
||||||
|
{
|
||||||
|
return blocking_notifier_chain_register(&acpi_chain_head, nb);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(register_acpi_notifier);
|
||||||
|
|
||||||
|
int unregister_acpi_notifier(struct notifier_block *nb)
|
||||||
|
{
|
||||||
|
return blocking_notifier_chain_unregister(&acpi_chain_head, nb);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(unregister_acpi_notifier);
|
||||||
|
|
||||||
#ifdef CONFIG_NET
|
#ifdef CONFIG_NET
|
||||||
static unsigned int acpi_event_seqnum;
|
static unsigned int acpi_event_seqnum;
|
||||||
struct acpi_genl_event {
|
struct acpi_genl_event {
|
||||||
|
|
|
@ -73,8 +73,12 @@ MODULE_AUTHOR("Bruno Ducrot");
|
||||||
MODULE_DESCRIPTION("ACPI Video Driver");
|
MODULE_DESCRIPTION("ACPI Video Driver");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|
||||||
|
static int brightness_switch_enabled = 1;
|
||||||
|
module_param(brightness_switch_enabled, bool, 0644);
|
||||||
|
|
||||||
static int acpi_video_bus_add(struct acpi_device *device);
|
static int acpi_video_bus_add(struct acpi_device *device);
|
||||||
static int acpi_video_bus_remove(struct acpi_device *device, int type);
|
static int acpi_video_bus_remove(struct acpi_device *device, int type);
|
||||||
|
static int acpi_video_resume(struct acpi_device *device);
|
||||||
|
|
||||||
static const struct acpi_device_id video_device_ids[] = {
|
static const struct acpi_device_id video_device_ids[] = {
|
||||||
{ACPI_VIDEO_HID, 0},
|
{ACPI_VIDEO_HID, 0},
|
||||||
|
@ -89,6 +93,7 @@ static struct acpi_driver acpi_video_bus = {
|
||||||
.ops = {
|
.ops = {
|
||||||
.add = acpi_video_bus_add,
|
.add = acpi_video_bus_add,
|
||||||
.remove = acpi_video_bus_remove,
|
.remove = acpi_video_bus_remove,
|
||||||
|
.resume = acpi_video_resume,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -275,7 +280,6 @@ static void acpi_video_device_rebind(struct acpi_video_bus *video);
|
||||||
static void acpi_video_device_bind(struct acpi_video_bus *video,
|
static void acpi_video_device_bind(struct acpi_video_bus *video,
|
||||||
struct acpi_video_device *device);
|
struct acpi_video_device *device);
|
||||||
static int acpi_video_device_enumerate(struct acpi_video_bus *video);
|
static int acpi_video_device_enumerate(struct acpi_video_bus *video);
|
||||||
static int acpi_video_switch_output(struct acpi_video_bus *video, int event);
|
|
||||||
static int acpi_video_device_lcd_set_level(struct acpi_video_device *device,
|
static int acpi_video_device_lcd_set_level(struct acpi_video_device *device,
|
||||||
int level);
|
int level);
|
||||||
static int acpi_video_device_lcd_get_level_current(
|
static int acpi_video_device_lcd_get_level_current(
|
||||||
|
@ -800,11 +804,40 @@ static void acpi_video_bus_find_cap(struct acpi_video_bus *video)
|
||||||
static int acpi_video_bus_check(struct acpi_video_bus *video)
|
static int acpi_video_bus_check(struct acpi_video_bus *video)
|
||||||
{
|
{
|
||||||
acpi_status status = -ENOENT;
|
acpi_status status = -ENOENT;
|
||||||
|
long device_id;
|
||||||
|
struct device *dev;
|
||||||
|
struct acpi_device *device;
|
||||||
|
|
||||||
if (!video)
|
if (!video)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
device = video->device;
|
||||||
|
|
||||||
|
status =
|
||||||
|
acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id);
|
||||||
|
|
||||||
|
if (!ACPI_SUCCESS(status))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
/* We need to attempt to determine whether the _ADR refers to a
|
||||||
|
PCI device or not. There's no terribly good way to do this,
|
||||||
|
so the best we can hope for is to assume that there'll never
|
||||||
|
be a video device in the host bridge */
|
||||||
|
if (device_id >= 0x10000) {
|
||||||
|
/* It looks like a PCI device. Does it exist? */
|
||||||
|
dev = acpi_get_physical_device(device->handle);
|
||||||
|
} else {
|
||||||
|
/* It doesn't look like a PCI device. Does its parent
|
||||||
|
exist? */
|
||||||
|
acpi_handle phandle;
|
||||||
|
if (acpi_get_parent(device->handle, &phandle))
|
||||||
|
return -ENODEV;
|
||||||
|
dev = acpi_get_physical_device(phandle);
|
||||||
|
}
|
||||||
|
if (!dev)
|
||||||
|
return -ENODEV;
|
||||||
|
put_device(dev);
|
||||||
|
|
||||||
/* Since there is no HID, CID and so on for VGA driver, we have
|
/* Since there is no HID, CID and so on for VGA driver, we have
|
||||||
* to check well known required nodes.
|
* to check well known required nodes.
|
||||||
*/
|
*/
|
||||||
|
@ -1683,64 +1716,6 @@ static int acpi_video_device_enumerate(struct acpi_video_bus *video)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Arg:
|
|
||||||
* video : video bus device
|
|
||||||
* event : notify event
|
|
||||||
*
|
|
||||||
* Return:
|
|
||||||
* < 0 : error
|
|
||||||
*
|
|
||||||
* 1. Find out the current active output device.
|
|
||||||
* 2. Identify the next output device to switch to.
|
|
||||||
* 3. call _DSS to do actual switch.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int acpi_video_switch_output(struct acpi_video_bus *video, int event)
|
|
||||||
{
|
|
||||||
struct list_head *node;
|
|
||||||
struct acpi_video_device *dev = NULL;
|
|
||||||
struct acpi_video_device *dev_next = NULL;
|
|
||||||
struct acpi_video_device *dev_prev = NULL;
|
|
||||||
unsigned long state;
|
|
||||||
int status = 0;
|
|
||||||
|
|
||||||
mutex_lock(&video->device_list_lock);
|
|
||||||
|
|
||||||
list_for_each(node, &video->video_device_list) {
|
|
||||||
dev = container_of(node, struct acpi_video_device, entry);
|
|
||||||
status = acpi_video_device_get_state(dev, &state);
|
|
||||||
if (state & 0x2) {
|
|
||||||
dev_next = container_of(node->next,
|
|
||||||
struct acpi_video_device, entry);
|
|
||||||
dev_prev = container_of(node->prev,
|
|
||||||
struct acpi_video_device, entry);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dev_next = container_of(node->next, struct acpi_video_device, entry);
|
|
||||||
dev_prev = container_of(node->prev, struct acpi_video_device, entry);
|
|
||||||
|
|
||||||
out:
|
|
||||||
mutex_unlock(&video->device_list_lock);
|
|
||||||
|
|
||||||
switch (event) {
|
|
||||||
case ACPI_VIDEO_NOTIFY_CYCLE:
|
|
||||||
case ACPI_VIDEO_NOTIFY_NEXT_OUTPUT:
|
|
||||||
acpi_video_device_set_state(dev, 0);
|
|
||||||
acpi_video_device_set_state(dev_next, 0x80000001);
|
|
||||||
break;
|
|
||||||
case ACPI_VIDEO_NOTIFY_PREV_OUTPUT:
|
|
||||||
acpi_video_device_set_state(dev, 0);
|
|
||||||
acpi_video_device_set_state(dev_prev, 0x80000001);
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
acpi_video_get_next_level(struct acpi_video_device *device,
|
acpi_video_get_next_level(struct acpi_video_device *device,
|
||||||
u32 level_current, u32 event)
|
u32 level_current, u32 event)
|
||||||
|
@ -1908,23 +1883,19 @@ static void acpi_video_bus_notify(acpi_handle handle, u32 event, void *data)
|
||||||
* connector. */
|
* connector. */
|
||||||
acpi_video_device_enumerate(video);
|
acpi_video_device_enumerate(video);
|
||||||
acpi_video_device_rebind(video);
|
acpi_video_device_rebind(video);
|
||||||
acpi_video_switch_output(video, event);
|
|
||||||
acpi_bus_generate_proc_event(device, event, 0);
|
acpi_bus_generate_proc_event(device, event, 0);
|
||||||
keycode = KEY_SWITCHVIDEOMODE;
|
keycode = KEY_SWITCHVIDEOMODE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ACPI_VIDEO_NOTIFY_CYCLE: /* Cycle Display output hotkey pressed. */
|
case ACPI_VIDEO_NOTIFY_CYCLE: /* Cycle Display output hotkey pressed. */
|
||||||
acpi_video_switch_output(video, event);
|
|
||||||
acpi_bus_generate_proc_event(device, event, 0);
|
acpi_bus_generate_proc_event(device, event, 0);
|
||||||
keycode = KEY_SWITCHVIDEOMODE;
|
keycode = KEY_SWITCHVIDEOMODE;
|
||||||
break;
|
break;
|
||||||
case ACPI_VIDEO_NOTIFY_NEXT_OUTPUT: /* Next Display output hotkey pressed. */
|
case ACPI_VIDEO_NOTIFY_NEXT_OUTPUT: /* Next Display output hotkey pressed. */
|
||||||
acpi_video_switch_output(video, event);
|
|
||||||
acpi_bus_generate_proc_event(device, event, 0);
|
acpi_bus_generate_proc_event(device, event, 0);
|
||||||
keycode = KEY_VIDEO_NEXT;
|
keycode = KEY_VIDEO_NEXT;
|
||||||
break;
|
break;
|
||||||
case ACPI_VIDEO_NOTIFY_PREV_OUTPUT: /* previous Display output hotkey pressed. */
|
case ACPI_VIDEO_NOTIFY_PREV_OUTPUT: /* previous Display output hotkey pressed. */
|
||||||
acpi_video_switch_output(video, event);
|
|
||||||
acpi_bus_generate_proc_event(device, event, 0);
|
acpi_bus_generate_proc_event(device, event, 0);
|
||||||
keycode = KEY_VIDEO_PREV;
|
keycode = KEY_VIDEO_PREV;
|
||||||
break;
|
break;
|
||||||
|
@ -1936,6 +1907,7 @@ static void acpi_video_bus_notify(acpi_handle handle, u32 event, void *data)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
acpi_notifier_call_chain(device, event, 0);
|
||||||
input_report_key(input, keycode, 1);
|
input_report_key(input, keycode, 1);
|
||||||
input_sync(input);
|
input_sync(input);
|
||||||
input_report_key(input, keycode, 0);
|
input_report_key(input, keycode, 0);
|
||||||
|
@ -1961,27 +1933,32 @@ static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS: /* Cycle brightness */
|
case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS: /* Cycle brightness */
|
||||||
acpi_video_switch_brightness(video_device, event);
|
if (brightness_switch_enabled)
|
||||||
|
acpi_video_switch_brightness(video_device, event);
|
||||||
acpi_bus_generate_proc_event(device, event, 0);
|
acpi_bus_generate_proc_event(device, event, 0);
|
||||||
keycode = KEY_BRIGHTNESS_CYCLE;
|
keycode = KEY_BRIGHTNESS_CYCLE;
|
||||||
break;
|
break;
|
||||||
case ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS: /* Increase brightness */
|
case ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS: /* Increase brightness */
|
||||||
acpi_video_switch_brightness(video_device, event);
|
if (brightness_switch_enabled)
|
||||||
|
acpi_video_switch_brightness(video_device, event);
|
||||||
acpi_bus_generate_proc_event(device, event, 0);
|
acpi_bus_generate_proc_event(device, event, 0);
|
||||||
keycode = KEY_BRIGHTNESSUP;
|
keycode = KEY_BRIGHTNESSUP;
|
||||||
break;
|
break;
|
||||||
case ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS: /* Decrease brightness */
|
case ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS: /* Decrease brightness */
|
||||||
acpi_video_switch_brightness(video_device, event);
|
if (brightness_switch_enabled)
|
||||||
|
acpi_video_switch_brightness(video_device, event);
|
||||||
acpi_bus_generate_proc_event(device, event, 0);
|
acpi_bus_generate_proc_event(device, event, 0);
|
||||||
keycode = KEY_BRIGHTNESSDOWN;
|
keycode = KEY_BRIGHTNESSDOWN;
|
||||||
break;
|
break;
|
||||||
case ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS: /* zero brightnesss */
|
case ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS: /* zero brightnesss */
|
||||||
acpi_video_switch_brightness(video_device, event);
|
if (brightness_switch_enabled)
|
||||||
|
acpi_video_switch_brightness(video_device, event);
|
||||||
acpi_bus_generate_proc_event(device, event, 0);
|
acpi_bus_generate_proc_event(device, event, 0);
|
||||||
keycode = KEY_BRIGHTNESS_ZERO;
|
keycode = KEY_BRIGHTNESS_ZERO;
|
||||||
break;
|
break;
|
||||||
case ACPI_VIDEO_NOTIFY_DISPLAY_OFF: /* display device off */
|
case ACPI_VIDEO_NOTIFY_DISPLAY_OFF: /* display device off */
|
||||||
acpi_video_switch_brightness(video_device, event);
|
if (brightness_switch_enabled)
|
||||||
|
acpi_video_switch_brightness(video_device, event);
|
||||||
acpi_bus_generate_proc_event(device, event, 0);
|
acpi_bus_generate_proc_event(device, event, 0);
|
||||||
keycode = KEY_DISPLAY_OFF;
|
keycode = KEY_DISPLAY_OFF;
|
||||||
break;
|
break;
|
||||||
|
@ -1992,6 +1969,7 @@ static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
acpi_notifier_call_chain(device, event, 0);
|
||||||
input_report_key(input, keycode, 1);
|
input_report_key(input, keycode, 1);
|
||||||
input_sync(input);
|
input_sync(input);
|
||||||
input_report_key(input, keycode, 0);
|
input_report_key(input, keycode, 0);
|
||||||
|
@ -2001,6 +1979,25 @@ static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int instance;
|
static int instance;
|
||||||
|
static int acpi_video_resume(struct acpi_device *device)
|
||||||
|
{
|
||||||
|
struct acpi_video_bus *video;
|
||||||
|
struct acpi_video_device *video_device;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!device || !acpi_driver_data(device))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
video = acpi_driver_data(device);
|
||||||
|
|
||||||
|
for (i = 0; i < video->attached_count; i++) {
|
||||||
|
video_device = video->attached_array[i].bind_info;
|
||||||
|
if (video_device && video_device->backlight)
|
||||||
|
acpi_video_set_brightness(video_device->backlight);
|
||||||
|
}
|
||||||
|
return AE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static int acpi_video_bus_add(struct acpi_device *device)
|
static int acpi_video_bus_add(struct acpi_device *device)
|
||||||
{
|
{
|
||||||
acpi_status status;
|
acpi_status status;
|
||||||
|
|
|
@ -323,6 +323,9 @@ extern struct kobject *acpi_kobj;
|
||||||
extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int);
|
extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int);
|
||||||
void acpi_bus_private_data_handler(acpi_handle, u32, void *);
|
void acpi_bus_private_data_handler(acpi_handle, u32, void *);
|
||||||
int acpi_bus_get_private_data(acpi_handle, void **);
|
int acpi_bus_get_private_data(acpi_handle, void **);
|
||||||
|
extern int acpi_notifier_call_chain(struct acpi_device *, u32, u32);
|
||||||
|
extern int register_acpi_notifier(struct notifier_block *);
|
||||||
|
extern int unregister_acpi_notifier(struct notifier_block *);
|
||||||
/*
|
/*
|
||||||
* External Functions
|
* External Functions
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue