0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #define pr_fmt(fmt) "ACPI: video: " fmt
0011
0012 #include <linux/kernel.h>
0013 #include <linux/module.h>
0014 #include <linux/init.h>
0015 #include <linux/types.h>
0016 #include <linux/list.h>
0017 #include <linux/mutex.h>
0018 #include <linux/input.h>
0019 #include <linux/backlight.h>
0020 #include <linux/thermal.h>
0021 #include <linux/sort.h>
0022 #include <linux/pci.h>
0023 #include <linux/pci_ids.h>
0024 #include <linux/slab.h>
0025 #include <linux/dmi.h>
0026 #include <linux/suspend.h>
0027 #include <linux/acpi.h>
0028 #include <acpi/video.h>
0029 #include <linux/uaccess.h>
0030
0031 #define ACPI_VIDEO_BUS_NAME "Video Bus"
0032 #define ACPI_VIDEO_DEVICE_NAME "Video Device"
0033
0034 #define MAX_NAME_LEN 20
0035
0036 MODULE_AUTHOR("Bruno Ducrot");
0037 MODULE_DESCRIPTION("ACPI Video Driver");
0038 MODULE_LICENSE("GPL");
0039
0040 static bool brightness_switch_enabled = true;
0041 module_param(brightness_switch_enabled, bool, 0644);
0042
0043
0044
0045
0046
0047 static bool allow_duplicates;
0048 module_param(allow_duplicates, bool, 0644);
0049
0050 static int disable_backlight_sysfs_if = -1;
0051 module_param(disable_backlight_sysfs_if, int, 0444);
0052
0053 #define REPORT_OUTPUT_KEY_EVENTS 0x01
0054 #define REPORT_BRIGHTNESS_KEY_EVENTS 0x02
0055 static int report_key_events = -1;
0056 module_param(report_key_events, int, 0644);
0057 MODULE_PARM_DESC(report_key_events,
0058 "0: none, 1: output changes, 2: brightness changes, 3: all");
0059
0060 static int hw_changes_brightness = -1;
0061 module_param(hw_changes_brightness, int, 0644);
0062 MODULE_PARM_DESC(hw_changes_brightness,
0063 "Set this to 1 on buggy hw which changes the brightness itself when "
0064 "a hotkey is pressed: -1: auto, 0: normal 1: hw-changes-brightness");
0065
0066
0067
0068
0069
0070 static bool device_id_scheme = false;
0071 module_param(device_id_scheme, bool, 0444);
0072
0073 static int only_lcd = -1;
0074 module_param(only_lcd, int, 0444);
0075
0076 static bool may_report_brightness_keys;
0077 static int register_count;
0078 static DEFINE_MUTEX(register_count_mutex);
0079 static DEFINE_MUTEX(video_list_lock);
0080 static LIST_HEAD(video_bus_head);
0081 static int acpi_video_bus_add(struct acpi_device *device);
0082 static int acpi_video_bus_remove(struct acpi_device *device);
0083 static void acpi_video_bus_notify(struct acpi_device *device, u32 event);
0084 void acpi_video_detect_exit(void);
0085
0086
0087
0088
0089
0090
0091
0092 enum acpi_video_level_idx {
0093 ACPI_VIDEO_AC_LEVEL,
0094 ACPI_VIDEO_BATTERY_LEVEL,
0095 ACPI_VIDEO_FIRST_LEVEL,
0096 };
0097
0098 static const struct acpi_device_id video_device_ids[] = {
0099 {ACPI_VIDEO_HID, 0},
0100 {"", 0},
0101 };
0102 MODULE_DEVICE_TABLE(acpi, video_device_ids);
0103
0104 static struct acpi_driver acpi_video_bus = {
0105 .name = "video",
0106 .class = ACPI_VIDEO_CLASS,
0107 .ids = video_device_ids,
0108 .ops = {
0109 .add = acpi_video_bus_add,
0110 .remove = acpi_video_bus_remove,
0111 .notify = acpi_video_bus_notify,
0112 },
0113 };
0114
0115 struct acpi_video_bus_flags {
0116 u8 multihead:1;
0117 u8 rom:1;
0118 u8 post:1;
0119 u8 reserved:5;
0120 };
0121
0122 struct acpi_video_bus_cap {
0123 u8 _DOS:1;
0124 u8 _DOD:1;
0125 u8 _ROM:1;
0126 u8 _GPD:1;
0127 u8 _SPD:1;
0128 u8 _VPO:1;
0129 u8 reserved:2;
0130 };
0131
0132 struct acpi_video_device_attrib {
0133 u32 display_index:4;
0134 u32 display_port_attachment:4;
0135 u32 display_type:4;
0136 u32 vendor_specific:4;
0137 u32 bios_can_detect:1;
0138 u32 depend_on_vga:1;
0139
0140 u32 pipe_id:3;
0141 u32 reserved:10;
0142
0143
0144
0145
0146
0147
0148
0149
0150 u32 device_id_scheme:1;
0151 };
0152
0153 struct acpi_video_enumerated_device {
0154 union {
0155 u32 int_val;
0156 struct acpi_video_device_attrib attrib;
0157 } value;
0158 struct acpi_video_device *bind_info;
0159 };
0160
0161 struct acpi_video_bus {
0162 struct acpi_device *device;
0163 bool backlight_registered;
0164 u8 dos_setting;
0165 struct acpi_video_enumerated_device *attached_array;
0166 u8 attached_count;
0167 u8 child_count;
0168 struct acpi_video_bus_cap cap;
0169 struct acpi_video_bus_flags flags;
0170 struct list_head video_device_list;
0171 struct mutex device_list_lock;
0172 struct list_head entry;
0173 struct input_dev *input;
0174 char phys[32];
0175 struct notifier_block pm_nb;
0176 };
0177
0178 struct acpi_video_device_flags {
0179 u8 crt:1;
0180 u8 lcd:1;
0181 u8 tvout:1;
0182 u8 dvi:1;
0183 u8 bios:1;
0184 u8 unknown:1;
0185 u8 notify:1;
0186 u8 reserved:1;
0187 };
0188
0189 struct acpi_video_device_cap {
0190 u8 _ADR:1;
0191 u8 _BCL:1;
0192 u8 _BCM:1;
0193 u8 _BQC:1;
0194 u8 _BCQ:1;
0195 u8 _DDC:1;
0196 };
0197
0198 struct acpi_video_device {
0199 unsigned long device_id;
0200 struct acpi_video_device_flags flags;
0201 struct acpi_video_device_cap cap;
0202 struct list_head entry;
0203 struct delayed_work switch_brightness_work;
0204 int switch_brightness_event;
0205 struct acpi_video_bus *video;
0206 struct acpi_device *dev;
0207 struct acpi_video_device_brightness *brightness;
0208 struct backlight_device *backlight;
0209 struct thermal_cooling_device *cooling_dev;
0210 };
0211
0212 static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data);
0213 static void acpi_video_device_rebind(struct acpi_video_bus *video);
0214 static void acpi_video_device_bind(struct acpi_video_bus *video,
0215 struct acpi_video_device *device);
0216 static int acpi_video_device_enumerate(struct acpi_video_bus *video);
0217 static int acpi_video_device_lcd_set_level(struct acpi_video_device *device,
0218 int level);
0219 static int acpi_video_device_lcd_get_level_current(
0220 struct acpi_video_device *device,
0221 unsigned long long *level, bool raw);
0222 static int acpi_video_get_next_level(struct acpi_video_device *device,
0223 u32 level_current, u32 event);
0224 static void acpi_video_switch_brightness(struct work_struct *work);
0225
0226
0227 static int acpi_video_get_brightness(struct backlight_device *bd)
0228 {
0229 unsigned long long cur_level;
0230 int i;
0231 struct acpi_video_device *vd = bl_get_data(bd);
0232
0233 if (acpi_video_device_lcd_get_level_current(vd, &cur_level, false))
0234 return -EINVAL;
0235 for (i = ACPI_VIDEO_FIRST_LEVEL; i < vd->brightness->count; i++) {
0236 if (vd->brightness->levels[i] == cur_level)
0237 return i - ACPI_VIDEO_FIRST_LEVEL;
0238 }
0239 return 0;
0240 }
0241
0242 static int acpi_video_set_brightness(struct backlight_device *bd)
0243 {
0244 int request_level = bd->props.brightness + ACPI_VIDEO_FIRST_LEVEL;
0245 struct acpi_video_device *vd = bl_get_data(bd);
0246
0247 cancel_delayed_work(&vd->switch_brightness_work);
0248 return acpi_video_device_lcd_set_level(vd,
0249 vd->brightness->levels[request_level]);
0250 }
0251
0252 static const struct backlight_ops acpi_backlight_ops = {
0253 .get_brightness = acpi_video_get_brightness,
0254 .update_status = acpi_video_set_brightness,
0255 };
0256
0257
0258 static int video_get_max_state(struct thermal_cooling_device *cooling_dev,
0259 unsigned long *state)
0260 {
0261 struct acpi_device *device = cooling_dev->devdata;
0262 struct acpi_video_device *video = acpi_driver_data(device);
0263
0264 *state = video->brightness->count - ACPI_VIDEO_FIRST_LEVEL - 1;
0265 return 0;
0266 }
0267
0268 static int video_get_cur_state(struct thermal_cooling_device *cooling_dev,
0269 unsigned long *state)
0270 {
0271 struct acpi_device *device = cooling_dev->devdata;
0272 struct acpi_video_device *video = acpi_driver_data(device);
0273 unsigned long long level;
0274 int offset;
0275
0276 if (acpi_video_device_lcd_get_level_current(video, &level, false))
0277 return -EINVAL;
0278 for (offset = ACPI_VIDEO_FIRST_LEVEL; offset < video->brightness->count;
0279 offset++)
0280 if (level == video->brightness->levels[offset]) {
0281 *state = video->brightness->count - offset - 1;
0282 return 0;
0283 }
0284
0285 return -EINVAL;
0286 }
0287
0288 static int
0289 video_set_cur_state(struct thermal_cooling_device *cooling_dev, unsigned long state)
0290 {
0291 struct acpi_device *device = cooling_dev->devdata;
0292 struct acpi_video_device *video = acpi_driver_data(device);
0293 int level;
0294
0295 if (state >= video->brightness->count - ACPI_VIDEO_FIRST_LEVEL)
0296 return -EINVAL;
0297
0298 state = video->brightness->count - state;
0299 level = video->brightness->levels[state - 1];
0300 return acpi_video_device_lcd_set_level(video, level);
0301 }
0302
0303 static const struct thermal_cooling_device_ops video_cooling_ops = {
0304 .get_max_state = video_get_max_state,
0305 .get_cur_state = video_get_cur_state,
0306 .set_cur_state = video_set_cur_state,
0307 };
0308
0309
0310
0311
0312
0313
0314
0315 static int
0316 acpi_video_device_lcd_query_levels(acpi_handle handle,
0317 union acpi_object **levels)
0318 {
0319 int status;
0320 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
0321 union acpi_object *obj;
0322
0323
0324 *levels = NULL;
0325
0326 status = acpi_evaluate_object(handle, "_BCL", NULL, &buffer);
0327 if (ACPI_FAILURE(status))
0328 return status;
0329 obj = (union acpi_object *)buffer.pointer;
0330 if (!obj || (obj->type != ACPI_TYPE_PACKAGE)) {
0331 acpi_handle_info(handle, "Invalid _BCL data\n");
0332 status = -EFAULT;
0333 goto err;
0334 }
0335
0336 *levels = obj;
0337
0338 return 0;
0339
0340 err:
0341 kfree(buffer.pointer);
0342
0343 return status;
0344 }
0345
0346 static int
0347 acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level)
0348 {
0349 int status;
0350 int state;
0351
0352 status = acpi_execute_simple_method(device->dev->handle,
0353 "_BCM", level);
0354 if (ACPI_FAILURE(status)) {
0355 acpi_handle_info(device->dev->handle, "_BCM evaluation failed\n");
0356 return -EIO;
0357 }
0358
0359 device->brightness->curr = level;
0360 for (state = ACPI_VIDEO_FIRST_LEVEL; state < device->brightness->count;
0361 state++)
0362 if (level == device->brightness->levels[state]) {
0363 if (device->backlight)
0364 device->backlight->props.brightness =
0365 state - ACPI_VIDEO_FIRST_LEVEL;
0366 return 0;
0367 }
0368
0369 acpi_handle_info(device->dev->handle, "Current brightness invalid\n");
0370 return -EINVAL;
0371 }
0372
0373
0374
0375
0376
0377
0378 static int bqc_offset_aml_bug_workaround;
0379 static int video_set_bqc_offset(const struct dmi_system_id *d)
0380 {
0381 bqc_offset_aml_bug_workaround = 9;
0382 return 0;
0383 }
0384
0385 static int video_disable_backlight_sysfs_if(
0386 const struct dmi_system_id *d)
0387 {
0388 if (disable_backlight_sysfs_if == -1)
0389 disable_backlight_sysfs_if = 1;
0390 return 0;
0391 }
0392
0393 static int video_set_device_id_scheme(const struct dmi_system_id *d)
0394 {
0395 device_id_scheme = true;
0396 return 0;
0397 }
0398
0399 static int video_enable_only_lcd(const struct dmi_system_id *d)
0400 {
0401 only_lcd = true;
0402 return 0;
0403 }
0404
0405 static int video_set_report_key_events(const struct dmi_system_id *id)
0406 {
0407 if (report_key_events == -1)
0408 report_key_events = (uintptr_t)id->driver_data;
0409 return 0;
0410 }
0411
0412 static int video_hw_changes_brightness(
0413 const struct dmi_system_id *d)
0414 {
0415 if (hw_changes_brightness == -1)
0416 hw_changes_brightness = 1;
0417 return 0;
0418 }
0419
0420 static const struct dmi_system_id video_dmi_table[] = {
0421
0422
0423
0424 {
0425 .callback = video_set_bqc_offset,
0426 .ident = "Acer Aspire 5720",
0427 .matches = {
0428 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
0429 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"),
0430 },
0431 },
0432 {
0433 .callback = video_set_bqc_offset,
0434 .ident = "Acer Aspire 5710Z",
0435 .matches = {
0436 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
0437 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710Z"),
0438 },
0439 },
0440 {
0441 .callback = video_set_bqc_offset,
0442 .ident = "eMachines E510",
0443 .matches = {
0444 DMI_MATCH(DMI_BOARD_VENDOR, "EMACHINES"),
0445 DMI_MATCH(DMI_PRODUCT_NAME, "eMachines E510"),
0446 },
0447 },
0448 {
0449 .callback = video_set_bqc_offset,
0450 .ident = "Acer Aspire 5315",
0451 .matches = {
0452 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
0453 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"),
0454 },
0455 },
0456 {
0457 .callback = video_set_bqc_offset,
0458 .ident = "Acer Aspire 7720",
0459 .matches = {
0460 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
0461 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720"),
0462 },
0463 },
0464
0465
0466
0467
0468
0469
0470
0471
0472 {
0473
0474 .callback = video_disable_backlight_sysfs_if,
0475 .ident = "Toshiba Portege R700",
0476 .matches = {
0477 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
0478 DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R700"),
0479 },
0480 },
0481 {
0482
0483 .callback = video_disable_backlight_sysfs_if,
0484 .ident = "Toshiba Portege R830",
0485 .matches = {
0486 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
0487 DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R830"),
0488 },
0489 },
0490 {
0491
0492 .callback = video_disable_backlight_sysfs_if,
0493 .ident = "Toshiba Satellite R830",
0494 .matches = {
0495 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
0496 DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE R830"),
0497 },
0498 },
0499
0500
0501
0502
0503 {
0504
0505 .callback = video_set_device_id_scheme,
0506 .ident = "ESPRIMO Mobile M9410",
0507 .matches = {
0508 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
0509 DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile M9410"),
0510 },
0511 },
0512
0513
0514
0515
0516
0517 {
0518
0519 .callback = video_enable_only_lcd,
0520 .ident = "ESPRIMO Mobile M9410",
0521 .matches = {
0522 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
0523 DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile M9410"),
0524 },
0525 },
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535 {
0536 .callback = video_set_report_key_events,
0537 .driver_data = (void *)((uintptr_t)REPORT_OUTPUT_KEY_EVENTS),
0538 .ident = "Dell Vostro V131",
0539 .matches = {
0540 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
0541 DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"),
0542 },
0543 },
0544 {
0545 .callback = video_set_report_key_events,
0546 .driver_data = (void *)((uintptr_t)REPORT_BRIGHTNESS_KEY_EVENTS),
0547 .ident = "Dell Vostro 3350",
0548 .matches = {
0549 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
0550 DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 3350"),
0551 },
0552 },
0553
0554
0555
0556
0557
0558
0559 {
0560
0561 .callback = video_hw_changes_brightness,
0562 .ident = "Packard Bell EasyNote MZ35",
0563 .matches = {
0564 DMI_MATCH(DMI_SYS_VENDOR, "Packard Bell"),
0565 DMI_MATCH(DMI_PRODUCT_NAME, "EasyNote MZ35"),
0566 },
0567 },
0568 {}
0569 };
0570
0571 static unsigned long long
0572 acpi_video_bqc_value_to_level(struct acpi_video_device *device,
0573 unsigned long long bqc_value)
0574 {
0575 unsigned long long level;
0576
0577 if (device->brightness->flags._BQC_use_index) {
0578
0579
0580
0581
0582
0583 if (device->brightness->flags._BCL_reversed)
0584 bqc_value = device->brightness->count -
0585 ACPI_VIDEO_FIRST_LEVEL - 1 - bqc_value;
0586
0587 level = device->brightness->levels[bqc_value +
0588 ACPI_VIDEO_FIRST_LEVEL];
0589 } else {
0590 level = bqc_value;
0591 }
0592
0593 level += bqc_offset_aml_bug_workaround;
0594
0595 return level;
0596 }
0597
0598 static int
0599 acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
0600 unsigned long long *level, bool raw)
0601 {
0602 acpi_status status = AE_OK;
0603 int i;
0604
0605 if (device->cap._BQC || device->cap._BCQ) {
0606 char *buf = device->cap._BQC ? "_BQC" : "_BCQ";
0607
0608 status = acpi_evaluate_integer(device->dev->handle, buf,
0609 NULL, level);
0610 if (ACPI_SUCCESS(status)) {
0611 if (raw) {
0612
0613
0614
0615
0616
0617 return 0;
0618 }
0619
0620 *level = acpi_video_bqc_value_to_level(device, *level);
0621
0622 for (i = ACPI_VIDEO_FIRST_LEVEL;
0623 i < device->brightness->count; i++)
0624 if (device->brightness->levels[i] == *level) {
0625 device->brightness->curr = *level;
0626 return 0;
0627 }
0628
0629
0630
0631
0632 acpi_handle_info(device->dev->handle,
0633 "%s returned an invalid level", buf);
0634 device->cap._BQC = device->cap._BCQ = 0;
0635 } else {
0636
0637
0638
0639
0640
0641
0642
0643
0644 acpi_handle_info(device->dev->handle,
0645 "%s evaluation failed", buf);
0646 device->cap._BQC = device->cap._BCQ = 0;
0647 }
0648 }
0649
0650 *level = device->brightness->curr;
0651 return 0;
0652 }
0653
0654 static int
0655 acpi_video_device_EDID(struct acpi_video_device *device,
0656 union acpi_object **edid, ssize_t length)
0657 {
0658 int status;
0659 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
0660 union acpi_object *obj;
0661 union acpi_object arg0 = { ACPI_TYPE_INTEGER };
0662 struct acpi_object_list args = { 1, &arg0 };
0663
0664
0665 *edid = NULL;
0666
0667 if (!device)
0668 return -ENODEV;
0669 if (length == 128)
0670 arg0.integer.value = 1;
0671 else if (length == 256)
0672 arg0.integer.value = 2;
0673 else
0674 return -EINVAL;
0675
0676 status = acpi_evaluate_object(device->dev->handle, "_DDC", &args, &buffer);
0677 if (ACPI_FAILURE(status))
0678 return -ENODEV;
0679
0680 obj = buffer.pointer;
0681
0682 if (obj && obj->type == ACPI_TYPE_BUFFER)
0683 *edid = obj;
0684 else {
0685 acpi_handle_info(device->dev->handle, "Invalid _DDC data\n");
0686 status = -EFAULT;
0687 kfree(obj);
0688 }
0689
0690 return status;
0691 }
0692
0693
0694
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714
0715
0716
0717
0718
0719
0720 static int
0721 acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag)
0722 {
0723 acpi_status status;
0724
0725 if (!video->cap._DOS)
0726 return 0;
0727
0728 if (bios_flag < 0 || bios_flag > 3 || lcd_flag < 0 || lcd_flag > 1)
0729 return -EINVAL;
0730 video->dos_setting = (lcd_flag << 2) | bios_flag;
0731 status = acpi_execute_simple_method(video->device->handle, "_DOS",
0732 (lcd_flag << 2) | bios_flag);
0733 if (ACPI_FAILURE(status))
0734 return -EIO;
0735
0736 return 0;
0737 }
0738
0739
0740
0741
0742
0743 static int
0744 acpi_video_cmp_level(const void *a, const void *b)
0745 {
0746 return *(int *)a - *(int *)b;
0747 }
0748
0749
0750
0751
0752
0753
0754
0755
0756 static int acpi_video_bqc_quirk(struct acpi_video_device *device,
0757 int max_level, int current_level)
0758 {
0759 struct acpi_video_device_brightness *br = device->brightness;
0760 int result;
0761 unsigned long long level;
0762 int test_level;
0763
0764
0765 if (bqc_offset_aml_bug_workaround)
0766 return 0;
0767
0768
0769
0770
0771
0772
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796
0797
0798 test_level = current_level == max_level
0799 ? br->levels[ACPI_VIDEO_FIRST_LEVEL + 1]
0800 : max_level;
0801
0802 result = acpi_video_device_lcd_set_level(device, test_level);
0803 if (result)
0804 return result;
0805
0806 result = acpi_video_device_lcd_get_level_current(device, &level, true);
0807 if (result)
0808 return result;
0809
0810 if (level != test_level) {
0811
0812 if (level < br->count) {
0813 if (br->flags._BCL_reversed)
0814 level = br->count - ACPI_VIDEO_FIRST_LEVEL - 1 - level;
0815 if (br->levels[level + ACPI_VIDEO_FIRST_LEVEL] == test_level)
0816 br->flags._BQC_use_index = 1;
0817 }
0818
0819 if (!br->flags._BQC_use_index)
0820 device->cap._BQC = device->cap._BCQ = 0;
0821 }
0822
0823 return 0;
0824 }
0825
0826 int acpi_video_get_levels(struct acpi_device *device,
0827 struct acpi_video_device_brightness **dev_br,
0828 int *pmax_level)
0829 {
0830 union acpi_object *obj = NULL;
0831 int i, max_level = 0, count = 0, level_ac_battery = 0;
0832 union acpi_object *o;
0833 struct acpi_video_device_brightness *br = NULL;
0834 int result = 0;
0835 u32 value;
0836
0837 if (ACPI_FAILURE(acpi_video_device_lcd_query_levels(device->handle, &obj))) {
0838 acpi_handle_debug(device->handle,
0839 "Could not query available LCD brightness level\n");
0840 result = -ENODEV;
0841 goto out;
0842 }
0843
0844 if (obj->package.count < ACPI_VIDEO_FIRST_LEVEL) {
0845 result = -EINVAL;
0846 goto out;
0847 }
0848
0849 br = kzalloc(sizeof(*br), GFP_KERNEL);
0850 if (!br) {
0851 result = -ENOMEM;
0852 goto out;
0853 }
0854
0855
0856
0857
0858
0859
0860 br->levels = kmalloc_array(obj->package.count + ACPI_VIDEO_FIRST_LEVEL,
0861 sizeof(*br->levels),
0862 GFP_KERNEL);
0863 if (!br->levels) {
0864 result = -ENOMEM;
0865 goto out_free;
0866 }
0867
0868 for (i = 0; i < obj->package.count; i++) {
0869 o = (union acpi_object *)&obj->package.elements[i];
0870 if (o->type != ACPI_TYPE_INTEGER) {
0871 acpi_handle_info(device->handle, "Invalid data\n");
0872 continue;
0873 }
0874 value = (u32) o->integer.value;
0875
0876 if (count > ACPI_VIDEO_FIRST_LEVEL
0877 && br->levels[count - 1] == value)
0878 continue;
0879
0880 br->levels[count] = value;
0881
0882 if (br->levels[count] > max_level)
0883 max_level = br->levels[count];
0884 count++;
0885 }
0886
0887
0888
0889
0890
0891
0892
0893 for (i = ACPI_VIDEO_FIRST_LEVEL; i < count; i++) {
0894 if (br->levels[i] == br->levels[ACPI_VIDEO_AC_LEVEL])
0895 level_ac_battery++;
0896 if (br->levels[i] == br->levels[ACPI_VIDEO_BATTERY_LEVEL])
0897 level_ac_battery++;
0898 }
0899
0900 if (level_ac_battery < ACPI_VIDEO_FIRST_LEVEL) {
0901 level_ac_battery = ACPI_VIDEO_FIRST_LEVEL - level_ac_battery;
0902 br->flags._BCL_no_ac_battery_levels = 1;
0903 for (i = (count - 1 + level_ac_battery);
0904 i >= ACPI_VIDEO_FIRST_LEVEL; i--)
0905 br->levels[i] = br->levels[i - level_ac_battery];
0906 count += level_ac_battery;
0907 } else if (level_ac_battery > ACPI_VIDEO_FIRST_LEVEL)
0908 acpi_handle_info(device->handle,
0909 "Too many duplicates in _BCL package");
0910
0911
0912 if (max_level == br->levels[ACPI_VIDEO_FIRST_LEVEL]) {
0913 br->flags._BCL_reversed = 1;
0914 sort(&br->levels[ACPI_VIDEO_FIRST_LEVEL],
0915 count - ACPI_VIDEO_FIRST_LEVEL,
0916 sizeof(br->levels[ACPI_VIDEO_FIRST_LEVEL]),
0917 acpi_video_cmp_level, NULL);
0918 } else if (max_level != br->levels[count - 1])
0919 acpi_handle_info(device->handle,
0920 "Found unordered _BCL package");
0921
0922 br->count = count;
0923 *dev_br = br;
0924 if (pmax_level)
0925 *pmax_level = max_level;
0926
0927 out:
0928 kfree(obj);
0929 return result;
0930 out_free:
0931 kfree(br);
0932 goto out;
0933 }
0934 EXPORT_SYMBOL(acpi_video_get_levels);
0935
0936
0937
0938
0939
0940
0941
0942
0943
0944
0945
0946 static int
0947 acpi_video_init_brightness(struct acpi_video_device *device)
0948 {
0949 int i, max_level = 0;
0950 unsigned long long level, level_old;
0951 struct acpi_video_device_brightness *br = NULL;
0952 int result;
0953
0954 result = acpi_video_get_levels(device->dev, &br, &max_level);
0955 if (result)
0956 return result;
0957 device->brightness = br;
0958
0959
0960 br->curr = level = max_level;
0961
0962 if (!device->cap._BQC)
0963 goto set_level;
0964
0965 result = acpi_video_device_lcd_get_level_current(device,
0966 &level_old, true);
0967 if (result)
0968 goto out_free_levels;
0969
0970 result = acpi_video_bqc_quirk(device, max_level, level_old);
0971 if (result)
0972 goto out_free_levels;
0973
0974
0975
0976
0977 if (!device->cap._BQC)
0978 goto set_level;
0979
0980 level = acpi_video_bqc_value_to_level(device, level_old);
0981
0982
0983
0984
0985
0986
0987 for (i = ACPI_VIDEO_FIRST_LEVEL; i < br->count; i++)
0988 if (level == br->levels[i])
0989 break;
0990 if (i == br->count || !level)
0991 level = max_level;
0992
0993 set_level:
0994 result = acpi_video_device_lcd_set_level(device, level);
0995 if (result)
0996 goto out_free_levels;
0997
0998 acpi_handle_debug(device->dev->handle, "found %d brightness levels\n",
0999 br->count - ACPI_VIDEO_FIRST_LEVEL);
1000
1001 return 0;
1002
1003 out_free_levels:
1004 kfree(br->levels);
1005 kfree(br);
1006 device->brightness = NULL;
1007 return result;
1008 }
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021 static void acpi_video_device_find_cap(struct acpi_video_device *device)
1022 {
1023 if (acpi_has_method(device->dev->handle, "_ADR"))
1024 device->cap._ADR = 1;
1025 if (acpi_has_method(device->dev->handle, "_BCL"))
1026 device->cap._BCL = 1;
1027 if (acpi_has_method(device->dev->handle, "_BCM"))
1028 device->cap._BCM = 1;
1029 if (acpi_has_method(device->dev->handle, "_BQC")) {
1030 device->cap._BQC = 1;
1031 } else if (acpi_has_method(device->dev->handle, "_BCQ")) {
1032 acpi_handle_info(device->dev->handle,
1033 "_BCQ is used instead of _BQC\n");
1034 device->cap._BCQ = 1;
1035 }
1036
1037 if (acpi_has_method(device->dev->handle, "_DDC"))
1038 device->cap._DDC = 1;
1039 }
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051 static void acpi_video_bus_find_cap(struct acpi_video_bus *video)
1052 {
1053 if (acpi_has_method(video->device->handle, "_DOS"))
1054 video->cap._DOS = 1;
1055 if (acpi_has_method(video->device->handle, "_DOD"))
1056 video->cap._DOD = 1;
1057 if (acpi_has_method(video->device->handle, "_ROM"))
1058 video->cap._ROM = 1;
1059 if (acpi_has_method(video->device->handle, "_GPD"))
1060 video->cap._GPD = 1;
1061 if (acpi_has_method(video->device->handle, "_SPD"))
1062 video->cap._SPD = 1;
1063 if (acpi_has_method(video->device->handle, "_VPO"))
1064 video->cap._VPO = 1;
1065 }
1066
1067
1068
1069
1070
1071
1072 static int acpi_video_bus_check(struct acpi_video_bus *video)
1073 {
1074 acpi_status status = -ENOENT;
1075 struct pci_dev *dev;
1076
1077 if (!video)
1078 return -EINVAL;
1079
1080 dev = acpi_get_pci_dev(video->device->handle);
1081 if (!dev)
1082 return -ENODEV;
1083 pci_dev_put(dev);
1084
1085
1086
1087
1088
1089
1090
1091 if (video->cap._DOS || video->cap._DOD) {
1092 if (!video->cap._DOS) {
1093 pr_info(FW_BUG "ACPI(%s) defines _DOD but not _DOS\n",
1094 acpi_device_bid(video->device));
1095 }
1096 video->flags.multihead = 1;
1097 status = 0;
1098 }
1099
1100
1101 if (video->cap._ROM) {
1102 video->flags.rom = 1;
1103 status = 0;
1104 }
1105
1106
1107 if (video->cap._GPD && video->cap._SPD && video->cap._VPO) {
1108 video->flags.post = 1;
1109 status = 0;
1110 }
1111
1112 return status;
1113 }
1114
1115
1116
1117
1118
1119
1120
1121
1122 static struct acpi_video_device_attrib *
1123 acpi_video_get_device_attr(struct acpi_video_bus *video, unsigned long device_id)
1124 {
1125 struct acpi_video_enumerated_device *ids;
1126 int i;
1127
1128 for (i = 0; i < video->attached_count; i++) {
1129 ids = &video->attached_array[i];
1130 if ((ids->value.int_val & 0xffff) == device_id)
1131 return &ids->value.attrib;
1132 }
1133
1134 return NULL;
1135 }
1136
1137 static int
1138 acpi_video_get_device_type(struct acpi_video_bus *video,
1139 unsigned long device_id)
1140 {
1141 struct acpi_video_enumerated_device *ids;
1142 int i;
1143
1144 for (i = 0; i < video->attached_count; i++) {
1145 ids = &video->attached_array[i];
1146 if ((ids->value.int_val & 0xffff) == device_id)
1147 return ids->value.int_val;
1148 }
1149
1150 return 0;
1151 }
1152
1153 static int acpi_video_bus_get_one_device(struct acpi_device *device, void *arg)
1154 {
1155 struct acpi_video_bus *video = arg;
1156 struct acpi_video_device_attrib *attribute;
1157 struct acpi_video_device *data;
1158 unsigned long long device_id;
1159 acpi_status status;
1160 int device_type;
1161
1162 status = acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id);
1163
1164 if (ACPI_FAILURE(status))
1165 goto exit;
1166
1167 data = kzalloc(sizeof(struct acpi_video_device), GFP_KERNEL);
1168 if (!data) {
1169 dev_dbg(&device->dev, "Cannot attach\n");
1170 return -ENOMEM;
1171 }
1172
1173 strcpy(acpi_device_name(device), ACPI_VIDEO_DEVICE_NAME);
1174 strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS);
1175 device->driver_data = data;
1176
1177 data->device_id = device_id;
1178 data->video = video;
1179 data->dev = device;
1180 INIT_DELAYED_WORK(&data->switch_brightness_work,
1181 acpi_video_switch_brightness);
1182
1183 attribute = acpi_video_get_device_attr(video, device_id);
1184
1185 if (attribute && (attribute->device_id_scheme || device_id_scheme)) {
1186 switch (attribute->display_type) {
1187 case ACPI_VIDEO_DISPLAY_CRT:
1188 data->flags.crt = 1;
1189 break;
1190 case ACPI_VIDEO_DISPLAY_TV:
1191 data->flags.tvout = 1;
1192 break;
1193 case ACPI_VIDEO_DISPLAY_DVI:
1194 data->flags.dvi = 1;
1195 break;
1196 case ACPI_VIDEO_DISPLAY_LCD:
1197 data->flags.lcd = 1;
1198 break;
1199 default:
1200 data->flags.unknown = 1;
1201 break;
1202 }
1203 if (attribute->bios_can_detect)
1204 data->flags.bios = 1;
1205 } else {
1206
1207 device_type = acpi_video_get_device_type(video, device_id);
1208
1209 switch (device_type & 0xffe2ffff) {
1210 case ACPI_VIDEO_DISPLAY_LEGACY_MONITOR:
1211 data->flags.crt = 1;
1212 break;
1213 case ACPI_VIDEO_DISPLAY_LEGACY_PANEL:
1214 data->flags.lcd = 1;
1215 break;
1216 case ACPI_VIDEO_DISPLAY_LEGACY_TV:
1217 data->flags.tvout = 1;
1218 break;
1219 default:
1220 data->flags.unknown = 1;
1221 }
1222 }
1223
1224 acpi_video_device_bind(video, data);
1225 acpi_video_device_find_cap(data);
1226
1227 if (data->cap._BCM && data->cap._BCL)
1228 may_report_brightness_keys = true;
1229
1230 mutex_lock(&video->device_list_lock);
1231 list_add_tail(&data->entry, &video->video_device_list);
1232 mutex_unlock(&video->device_list_lock);
1233
1234 exit:
1235 video->child_count++;
1236 return 0;
1237 }
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251 static void acpi_video_device_rebind(struct acpi_video_bus *video)
1252 {
1253 struct acpi_video_device *dev;
1254
1255 mutex_lock(&video->device_list_lock);
1256
1257 list_for_each_entry(dev, &video->video_device_list, entry)
1258 acpi_video_device_bind(video, dev);
1259
1260 mutex_unlock(&video->device_list_lock);
1261 }
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276 static void
1277 acpi_video_device_bind(struct acpi_video_bus *video,
1278 struct acpi_video_device *device)
1279 {
1280 struct acpi_video_enumerated_device *ids;
1281 int i;
1282
1283 for (i = 0; i < video->attached_count; i++) {
1284 ids = &video->attached_array[i];
1285 if (device->device_id == (ids->value.int_val & 0xffff)) {
1286 ids->bind_info = device;
1287 acpi_handle_debug(video->device->handle, "%s: %d\n",
1288 __func__, i);
1289 }
1290 }
1291 }
1292
1293 static bool acpi_video_device_in_dod(struct acpi_video_device *device)
1294 {
1295 struct acpi_video_bus *video = device->video;
1296 int i;
1297
1298
1299
1300
1301
1302
1303 if (!video->attached_count || video->child_count > 8)
1304 return true;
1305
1306 for (i = 0; i < video->attached_count; i++) {
1307 if ((video->attached_array[i].value.int_val & 0xfff) ==
1308 (device->device_id & 0xfff))
1309 return true;
1310 }
1311
1312 return false;
1313 }
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326 static int acpi_video_device_enumerate(struct acpi_video_bus *video)
1327 {
1328 int status;
1329 int count;
1330 int i;
1331 struct acpi_video_enumerated_device *active_list;
1332 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
1333 union acpi_object *dod = NULL;
1334 union acpi_object *obj;
1335
1336 if (!video->cap._DOD)
1337 return AE_NOT_EXIST;
1338
1339 status = acpi_evaluate_object(video->device->handle, "_DOD", NULL, &buffer);
1340 if (ACPI_FAILURE(status)) {
1341 acpi_handle_info(video->device->handle,
1342 "_DOD evaluation failed: %s\n",
1343 acpi_format_exception(status));
1344 return status;
1345 }
1346
1347 dod = buffer.pointer;
1348 if (!dod || (dod->type != ACPI_TYPE_PACKAGE)) {
1349 acpi_handle_info(video->device->handle, "Invalid _DOD data\n");
1350 status = -EFAULT;
1351 goto out;
1352 }
1353
1354 acpi_handle_debug(video->device->handle, "Found %d video heads in _DOD\n",
1355 dod->package.count);
1356
1357 active_list = kcalloc(1 + dod->package.count,
1358 sizeof(struct acpi_video_enumerated_device),
1359 GFP_KERNEL);
1360 if (!active_list) {
1361 status = -ENOMEM;
1362 goto out;
1363 }
1364
1365 count = 0;
1366 for (i = 0; i < dod->package.count; i++) {
1367 obj = &dod->package.elements[i];
1368
1369 if (obj->type != ACPI_TYPE_INTEGER) {
1370 acpi_handle_info(video->device->handle,
1371 "Invalid _DOD data in element %d\n", i);
1372 continue;
1373 }
1374
1375 active_list[count].value.int_val = obj->integer.value;
1376 active_list[count].bind_info = NULL;
1377
1378 acpi_handle_debug(video->device->handle,
1379 "_DOD element[%d] = %d\n", i,
1380 (int)obj->integer.value);
1381
1382 count++;
1383 }
1384
1385 kfree(video->attached_array);
1386
1387 video->attached_array = active_list;
1388 video->attached_count = count;
1389
1390 out:
1391 kfree(buffer.pointer);
1392 return status;
1393 }
1394
1395 static int
1396 acpi_video_get_next_level(struct acpi_video_device *device,
1397 u32 level_current, u32 event)
1398 {
1399 int min, max, min_above, max_below, i, l, delta = 255;
1400 max = max_below = 0;
1401 min = min_above = 255;
1402
1403 for (i = ACPI_VIDEO_FIRST_LEVEL; i < device->brightness->count; i++) {
1404 l = device->brightness->levels[i];
1405 if (abs(l - level_current) < abs(delta)) {
1406 delta = l - level_current;
1407 if (!delta)
1408 break;
1409 }
1410 }
1411
1412 level_current += delta;
1413 for (i = ACPI_VIDEO_FIRST_LEVEL; i < device->brightness->count; i++) {
1414 l = device->brightness->levels[i];
1415 if (l < min)
1416 min = l;
1417 if (l > max)
1418 max = l;
1419 if (l < min_above && l > level_current)
1420 min_above = l;
1421 if (l > max_below && l < level_current)
1422 max_below = l;
1423 }
1424
1425 switch (event) {
1426 case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS:
1427 return (level_current < max) ? min_above : min;
1428 case ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS:
1429 return (level_current < max) ? min_above : max;
1430 case ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS:
1431 return (level_current > min) ? max_below : min;
1432 case ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS:
1433 case ACPI_VIDEO_NOTIFY_DISPLAY_OFF:
1434 return 0;
1435 default:
1436 return level_current;
1437 }
1438 }
1439
1440 static void
1441 acpi_video_switch_brightness(struct work_struct *work)
1442 {
1443 struct acpi_video_device *device = container_of(to_delayed_work(work),
1444 struct acpi_video_device, switch_brightness_work);
1445 unsigned long long level_current, level_next;
1446 int event = device->switch_brightness_event;
1447 int result = -EINVAL;
1448
1449
1450 if (!device->backlight)
1451 return;
1452
1453 if (!device->brightness)
1454 goto out;
1455
1456 result = acpi_video_device_lcd_get_level_current(device,
1457 &level_current,
1458 false);
1459 if (result)
1460 goto out;
1461
1462 level_next = acpi_video_get_next_level(device, level_current, event);
1463
1464 result = acpi_video_device_lcd_set_level(device, level_next);
1465
1466 if (!result)
1467 backlight_force_update(device->backlight,
1468 BACKLIGHT_UPDATE_HOTKEY);
1469
1470 out:
1471 if (result)
1472 acpi_handle_info(device->dev->handle,
1473 "Failed to switch brightness\n");
1474 }
1475
1476 int acpi_video_get_edid(struct acpi_device *device, int type, int device_id,
1477 void **edid)
1478 {
1479 struct acpi_video_bus *video;
1480 struct acpi_video_device *video_device;
1481 union acpi_object *buffer = NULL;
1482 acpi_status status;
1483 int i, length;
1484
1485 if (!device || !acpi_driver_data(device))
1486 return -EINVAL;
1487
1488 video = acpi_driver_data(device);
1489
1490 for (i = 0; i < video->attached_count; i++) {
1491 video_device = video->attached_array[i].bind_info;
1492 length = 256;
1493
1494 if (!video_device)
1495 continue;
1496
1497 if (!video_device->cap._DDC)
1498 continue;
1499
1500 if (type) {
1501 switch (type) {
1502 case ACPI_VIDEO_DISPLAY_CRT:
1503 if (!video_device->flags.crt)
1504 continue;
1505 break;
1506 case ACPI_VIDEO_DISPLAY_TV:
1507 if (!video_device->flags.tvout)
1508 continue;
1509 break;
1510 case ACPI_VIDEO_DISPLAY_DVI:
1511 if (!video_device->flags.dvi)
1512 continue;
1513 break;
1514 case ACPI_VIDEO_DISPLAY_LCD:
1515 if (!video_device->flags.lcd)
1516 continue;
1517 break;
1518 }
1519 } else if (video_device->device_id != device_id) {
1520 continue;
1521 }
1522
1523 status = acpi_video_device_EDID(video_device, &buffer, length);
1524
1525 if (ACPI_FAILURE(status) || !buffer ||
1526 buffer->type != ACPI_TYPE_BUFFER) {
1527 length = 128;
1528 status = acpi_video_device_EDID(video_device, &buffer,
1529 length);
1530 if (ACPI_FAILURE(status) || !buffer ||
1531 buffer->type != ACPI_TYPE_BUFFER) {
1532 continue;
1533 }
1534 }
1535
1536 *edid = buffer->buffer.pointer;
1537 return length;
1538 }
1539
1540 return -ENODEV;
1541 }
1542 EXPORT_SYMBOL(acpi_video_get_edid);
1543
1544 static int
1545 acpi_video_bus_get_devices(struct acpi_video_bus *video,
1546 struct acpi_device *device)
1547 {
1548
1549
1550
1551
1552
1553 acpi_video_device_enumerate(video);
1554
1555 return acpi_dev_for_each_child(device, acpi_video_bus_get_one_device, video);
1556 }
1557
1558
1559
1560
1561
1562
1563
1564 static int acpi_video_bus_start_devices(struct acpi_video_bus *video)
1565 {
1566 return acpi_video_bus_DOS(video, 0,
1567 acpi_osi_is_win8() ? 1 : 0);
1568 }
1569
1570 static int acpi_video_bus_stop_devices(struct acpi_video_bus *video)
1571 {
1572 return acpi_video_bus_DOS(video, 0,
1573 acpi_osi_is_win8() ? 0 : 1);
1574 }
1575
1576 static void acpi_video_bus_notify(struct acpi_device *device, u32 event)
1577 {
1578 struct acpi_video_bus *video = acpi_driver_data(device);
1579 struct input_dev *input;
1580 int keycode = 0;
1581
1582 if (!video || !video->input)
1583 return;
1584
1585 input = video->input;
1586
1587 switch (event) {
1588 case ACPI_VIDEO_NOTIFY_SWITCH:
1589
1590 keycode = KEY_SWITCHVIDEOMODE;
1591 break;
1592
1593 case ACPI_VIDEO_NOTIFY_PROBE:
1594
1595 acpi_video_device_enumerate(video);
1596 acpi_video_device_rebind(video);
1597 keycode = KEY_SWITCHVIDEOMODE;
1598 break;
1599
1600 case ACPI_VIDEO_NOTIFY_CYCLE:
1601 keycode = KEY_SWITCHVIDEOMODE;
1602 break;
1603 case ACPI_VIDEO_NOTIFY_NEXT_OUTPUT:
1604 keycode = KEY_VIDEO_NEXT;
1605 break;
1606 case ACPI_VIDEO_NOTIFY_PREV_OUTPUT:
1607 keycode = KEY_VIDEO_PREV;
1608 break;
1609
1610 default:
1611 acpi_handle_debug(device->handle, "Unsupported event [0x%x]\n",
1612 event);
1613 break;
1614 }
1615
1616 if (acpi_notifier_call_chain(device, event, 0))
1617
1618 keycode = 0;
1619
1620 if (keycode && (report_key_events & REPORT_OUTPUT_KEY_EVENTS)) {
1621 input_report_key(input, keycode, 1);
1622 input_sync(input);
1623 input_report_key(input, keycode, 0);
1624 input_sync(input);
1625 }
1626 }
1627
1628 static void brightness_switch_event(struct acpi_video_device *video_device,
1629 u32 event)
1630 {
1631 if (!brightness_switch_enabled)
1632 return;
1633
1634 video_device->switch_brightness_event = event;
1635 schedule_delayed_work(&video_device->switch_brightness_work, HZ / 10);
1636 }
1637
1638 static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)
1639 {
1640 struct acpi_video_device *video_device = data;
1641 struct acpi_device *device = NULL;
1642 struct acpi_video_bus *bus;
1643 struct input_dev *input;
1644 int keycode = 0;
1645
1646 if (!video_device)
1647 return;
1648
1649 device = video_device->dev;
1650 bus = video_device->video;
1651 input = bus->input;
1652
1653 if (hw_changes_brightness > 0) {
1654 if (video_device->backlight)
1655 backlight_force_update(video_device->backlight,
1656 BACKLIGHT_UPDATE_HOTKEY);
1657 acpi_notifier_call_chain(device, event, 0);
1658 return;
1659 }
1660
1661 switch (event) {
1662 case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS:
1663 brightness_switch_event(video_device, event);
1664 keycode = KEY_BRIGHTNESS_CYCLE;
1665 break;
1666 case ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS:
1667 brightness_switch_event(video_device, event);
1668 keycode = KEY_BRIGHTNESSUP;
1669 break;
1670 case ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS:
1671 brightness_switch_event(video_device, event);
1672 keycode = KEY_BRIGHTNESSDOWN;
1673 break;
1674 case ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS:
1675 brightness_switch_event(video_device, event);
1676 keycode = KEY_BRIGHTNESS_ZERO;
1677 break;
1678 case ACPI_VIDEO_NOTIFY_DISPLAY_OFF:
1679 brightness_switch_event(video_device, event);
1680 keycode = KEY_DISPLAY_OFF;
1681 break;
1682 default:
1683 acpi_handle_debug(handle, "Unsupported event [0x%x]\n", event);
1684 break;
1685 }
1686
1687 if (keycode)
1688 may_report_brightness_keys = true;
1689
1690 acpi_notifier_call_chain(device, event, 0);
1691
1692 if (keycode && (report_key_events & REPORT_BRIGHTNESS_KEY_EVENTS)) {
1693 input_report_key(input, keycode, 1);
1694 input_sync(input);
1695 input_report_key(input, keycode, 0);
1696 input_sync(input);
1697 }
1698 }
1699
1700 static int acpi_video_resume(struct notifier_block *nb,
1701 unsigned long val, void *ign)
1702 {
1703 struct acpi_video_bus *video;
1704 struct acpi_video_device *video_device;
1705 int i;
1706
1707 switch (val) {
1708 case PM_POST_HIBERNATION:
1709 case PM_POST_SUSPEND:
1710 case PM_POST_RESTORE:
1711 video = container_of(nb, struct acpi_video_bus, pm_nb);
1712
1713 dev_info(&video->device->dev, "Restoring backlight state\n");
1714
1715 for (i = 0; i < video->attached_count; i++) {
1716 video_device = video->attached_array[i].bind_info;
1717 if (video_device && video_device->brightness)
1718 acpi_video_device_lcd_set_level(video_device,
1719 video_device->brightness->curr);
1720 }
1721
1722 return NOTIFY_OK;
1723 }
1724 return NOTIFY_DONE;
1725 }
1726
1727 static acpi_status
1728 acpi_video_bus_match(acpi_handle handle, u32 level, void *context,
1729 void **return_value)
1730 {
1731 struct acpi_device *device = context;
1732 struct acpi_device *sibling;
1733
1734 if (handle == device->handle)
1735 return AE_CTRL_TERMINATE;
1736
1737 sibling = acpi_fetch_acpi_dev(handle);
1738 if (!sibling)
1739 return AE_OK;
1740
1741 if (!strcmp(acpi_device_name(sibling), ACPI_VIDEO_BUS_NAME))
1742 return AE_ALREADY_EXISTS;
1743
1744 return AE_OK;
1745 }
1746
1747 static void acpi_video_dev_register_backlight(struct acpi_video_device *device)
1748 {
1749 struct backlight_properties props;
1750 struct pci_dev *pdev;
1751 acpi_handle acpi_parent;
1752 struct device *parent = NULL;
1753 int result;
1754 static int count;
1755 char *name;
1756
1757 result = acpi_video_init_brightness(device);
1758 if (result)
1759 return;
1760
1761 if (disable_backlight_sysfs_if > 0)
1762 return;
1763
1764 name = kasprintf(GFP_KERNEL, "acpi_video%d", count);
1765 if (!name)
1766 return;
1767 count++;
1768
1769 acpi_get_parent(device->dev->handle, &acpi_parent);
1770
1771 pdev = acpi_get_pci_dev(acpi_parent);
1772 if (pdev) {
1773 parent = &pdev->dev;
1774 pci_dev_put(pdev);
1775 }
1776
1777 memset(&props, 0, sizeof(struct backlight_properties));
1778 props.type = BACKLIGHT_FIRMWARE;
1779 props.max_brightness =
1780 device->brightness->count - ACPI_VIDEO_FIRST_LEVEL - 1;
1781 device->backlight = backlight_device_register(name,
1782 parent,
1783 device,
1784 &acpi_backlight_ops,
1785 &props);
1786 kfree(name);
1787 if (IS_ERR(device->backlight)) {
1788 device->backlight = NULL;
1789 return;
1790 }
1791
1792
1793
1794
1795
1796 device->backlight->props.brightness =
1797 acpi_video_get_brightness(device->backlight);
1798
1799 device->cooling_dev = thermal_cooling_device_register("LCD",
1800 device->dev, &video_cooling_ops);
1801 if (IS_ERR(device->cooling_dev)) {
1802
1803
1804
1805
1806
1807
1808 device->cooling_dev = NULL;
1809 return;
1810 }
1811
1812 dev_info(&device->dev->dev, "registered as cooling_device%d\n",
1813 device->cooling_dev->id);
1814 result = sysfs_create_link(&device->dev->dev.kobj,
1815 &device->cooling_dev->device.kobj,
1816 "thermal_cooling");
1817 if (result)
1818 pr_info("sysfs link creation failed\n");
1819
1820 result = sysfs_create_link(&device->cooling_dev->device.kobj,
1821 &device->dev->dev.kobj, "device");
1822 if (result)
1823 pr_info("Reverse sysfs link creation failed\n");
1824 }
1825
1826 static void acpi_video_run_bcl_for_osi(struct acpi_video_bus *video)
1827 {
1828 struct acpi_video_device *dev;
1829 union acpi_object *levels;
1830
1831 mutex_lock(&video->device_list_lock);
1832 list_for_each_entry(dev, &video->video_device_list, entry) {
1833 if (!acpi_video_device_lcd_query_levels(dev->dev->handle, &levels))
1834 kfree(levels);
1835 }
1836 mutex_unlock(&video->device_list_lock);
1837 }
1838
1839 static bool acpi_video_should_register_backlight(struct acpi_video_device *dev)
1840 {
1841
1842
1843
1844
1845 if (!acpi_video_device_in_dod(dev)) {
1846 dev_dbg(&dev->dev->dev, "not in _DOD list, ignore\n");
1847 return false;
1848 }
1849
1850 if (only_lcd)
1851 return dev->flags.lcd;
1852 return true;
1853 }
1854
1855 static int acpi_video_bus_register_backlight(struct acpi_video_bus *video)
1856 {
1857 struct acpi_video_device *dev;
1858
1859 if (video->backlight_registered)
1860 return 0;
1861
1862 acpi_video_run_bcl_for_osi(video);
1863
1864 if (acpi_video_get_backlight_type() != acpi_backlight_video)
1865 return 0;
1866
1867 mutex_lock(&video->device_list_lock);
1868 list_for_each_entry(dev, &video->video_device_list, entry) {
1869 if (acpi_video_should_register_backlight(dev))
1870 acpi_video_dev_register_backlight(dev);
1871 }
1872 mutex_unlock(&video->device_list_lock);
1873
1874 video->backlight_registered = true;
1875
1876 video->pm_nb.notifier_call = acpi_video_resume;
1877 video->pm_nb.priority = 0;
1878 return register_pm_notifier(&video->pm_nb);
1879 }
1880
1881 static void acpi_video_dev_unregister_backlight(struct acpi_video_device *device)
1882 {
1883 if (device->backlight) {
1884 backlight_device_unregister(device->backlight);
1885 device->backlight = NULL;
1886 }
1887 if (device->brightness) {
1888 kfree(device->brightness->levels);
1889 kfree(device->brightness);
1890 device->brightness = NULL;
1891 }
1892 if (device->cooling_dev) {
1893 sysfs_remove_link(&device->dev->dev.kobj, "thermal_cooling");
1894 sysfs_remove_link(&device->cooling_dev->device.kobj, "device");
1895 thermal_cooling_device_unregister(device->cooling_dev);
1896 device->cooling_dev = NULL;
1897 }
1898 }
1899
1900 static int acpi_video_bus_unregister_backlight(struct acpi_video_bus *video)
1901 {
1902 struct acpi_video_device *dev;
1903 int error;
1904
1905 if (!video->backlight_registered)
1906 return 0;
1907
1908 error = unregister_pm_notifier(&video->pm_nb);
1909
1910 mutex_lock(&video->device_list_lock);
1911 list_for_each_entry(dev, &video->video_device_list, entry)
1912 acpi_video_dev_unregister_backlight(dev);
1913 mutex_unlock(&video->device_list_lock);
1914
1915 video->backlight_registered = false;
1916
1917 return error;
1918 }
1919
1920 static void acpi_video_dev_add_notify_handler(struct acpi_video_device *device)
1921 {
1922 acpi_status status;
1923 struct acpi_device *adev = device->dev;
1924
1925 status = acpi_install_notify_handler(adev->handle, ACPI_DEVICE_NOTIFY,
1926 acpi_video_device_notify, device);
1927 if (ACPI_FAILURE(status))
1928 dev_err(&adev->dev, "Error installing notify handler\n");
1929 else
1930 device->flags.notify = 1;
1931 }
1932
1933 static int acpi_video_bus_add_notify_handler(struct acpi_video_bus *video)
1934 {
1935 struct input_dev *input;
1936 struct acpi_video_device *dev;
1937 int error;
1938
1939 video->input = input = input_allocate_device();
1940 if (!input) {
1941 error = -ENOMEM;
1942 goto out;
1943 }
1944
1945 error = acpi_video_bus_start_devices(video);
1946 if (error)
1947 goto err_free_input;
1948
1949 snprintf(video->phys, sizeof(video->phys),
1950 "%s/video/input0", acpi_device_hid(video->device));
1951
1952 input->name = acpi_device_name(video->device);
1953 input->phys = video->phys;
1954 input->id.bustype = BUS_HOST;
1955 input->id.product = 0x06;
1956 input->dev.parent = &video->device->dev;
1957 input->evbit[0] = BIT(EV_KEY);
1958 set_bit(KEY_SWITCHVIDEOMODE, input->keybit);
1959 set_bit(KEY_VIDEO_NEXT, input->keybit);
1960 set_bit(KEY_VIDEO_PREV, input->keybit);
1961 set_bit(KEY_BRIGHTNESS_CYCLE, input->keybit);
1962 set_bit(KEY_BRIGHTNESSUP, input->keybit);
1963 set_bit(KEY_BRIGHTNESSDOWN, input->keybit);
1964 set_bit(KEY_BRIGHTNESS_ZERO, input->keybit);
1965 set_bit(KEY_DISPLAY_OFF, input->keybit);
1966
1967 error = input_register_device(input);
1968 if (error)
1969 goto err_stop_dev;
1970
1971 mutex_lock(&video->device_list_lock);
1972 list_for_each_entry(dev, &video->video_device_list, entry)
1973 acpi_video_dev_add_notify_handler(dev);
1974 mutex_unlock(&video->device_list_lock);
1975
1976 return 0;
1977
1978 err_stop_dev:
1979 acpi_video_bus_stop_devices(video);
1980 err_free_input:
1981 input_free_device(input);
1982 video->input = NULL;
1983 out:
1984 return error;
1985 }
1986
1987 static void acpi_video_dev_remove_notify_handler(struct acpi_video_device *dev)
1988 {
1989 if (dev->flags.notify) {
1990 acpi_remove_notify_handler(dev->dev->handle, ACPI_DEVICE_NOTIFY,
1991 acpi_video_device_notify);
1992 dev->flags.notify = 0;
1993 }
1994 }
1995
1996 static void acpi_video_bus_remove_notify_handler(struct acpi_video_bus *video)
1997 {
1998 struct acpi_video_device *dev;
1999
2000 mutex_lock(&video->device_list_lock);
2001 list_for_each_entry(dev, &video->video_device_list, entry)
2002 acpi_video_dev_remove_notify_handler(dev);
2003 mutex_unlock(&video->device_list_lock);
2004
2005 acpi_video_bus_stop_devices(video);
2006 input_unregister_device(video->input);
2007 video->input = NULL;
2008 }
2009
2010 static int acpi_video_bus_put_devices(struct acpi_video_bus *video)
2011 {
2012 struct acpi_video_device *dev, *next;
2013
2014 mutex_lock(&video->device_list_lock);
2015 list_for_each_entry_safe(dev, next, &video->video_device_list, entry) {
2016 list_del(&dev->entry);
2017 kfree(dev);
2018 }
2019 mutex_unlock(&video->device_list_lock);
2020
2021 return 0;
2022 }
2023
2024 static int instance;
2025
2026 static int acpi_video_bus_add(struct acpi_device *device)
2027 {
2028 struct acpi_video_bus *video;
2029 int error;
2030 acpi_status status;
2031
2032 status = acpi_walk_namespace(ACPI_TYPE_DEVICE,
2033 device->parent->handle, 1,
2034 acpi_video_bus_match, NULL,
2035 device, NULL);
2036 if (status == AE_ALREADY_EXISTS) {
2037 pr_info(FW_BUG
2038 "Duplicate ACPI video bus devices for the"
2039 " same VGA controller, please try module "
2040 "parameter \"video.allow_duplicates=1\""
2041 "if the current driver doesn't work.\n");
2042 if (!allow_duplicates)
2043 return -ENODEV;
2044 }
2045
2046 video = kzalloc(sizeof(struct acpi_video_bus), GFP_KERNEL);
2047 if (!video)
2048 return -ENOMEM;
2049
2050
2051 if (!strcmp(device->pnp.bus_id, "VID")) {
2052 if (instance)
2053 device->pnp.bus_id[3] = '0' + instance;
2054 instance++;
2055 }
2056
2057 if (!strcmp(device->pnp.bus_id, "VGA")) {
2058 if (instance)
2059 device->pnp.bus_id[3] = '0' + instance;
2060 instance++;
2061 }
2062
2063 video->device = device;
2064 strcpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME);
2065 strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS);
2066 device->driver_data = video;
2067
2068 acpi_video_bus_find_cap(video);
2069 error = acpi_video_bus_check(video);
2070 if (error)
2071 goto err_free_video;
2072
2073 mutex_init(&video->device_list_lock);
2074 INIT_LIST_HEAD(&video->video_device_list);
2075
2076 error = acpi_video_bus_get_devices(video, device);
2077 if (error)
2078 goto err_put_video;
2079
2080 pr_info("%s [%s] (multi-head: %s rom: %s post: %s)\n",
2081 ACPI_VIDEO_DEVICE_NAME, acpi_device_bid(device),
2082 video->flags.multihead ? "yes" : "no",
2083 video->flags.rom ? "yes" : "no",
2084 video->flags.post ? "yes" : "no");
2085 mutex_lock(&video_list_lock);
2086 list_add_tail(&video->entry, &video_bus_head);
2087 mutex_unlock(&video_list_lock);
2088
2089 acpi_video_bus_register_backlight(video);
2090 acpi_video_bus_add_notify_handler(video);
2091
2092 return 0;
2093
2094 err_put_video:
2095 acpi_video_bus_put_devices(video);
2096 kfree(video->attached_array);
2097 err_free_video:
2098 kfree(video);
2099 device->driver_data = NULL;
2100
2101 return error;
2102 }
2103
2104 static int acpi_video_bus_remove(struct acpi_device *device)
2105 {
2106 struct acpi_video_bus *video = NULL;
2107
2108
2109 if (!device || !acpi_driver_data(device))
2110 return -EINVAL;
2111
2112 video = acpi_driver_data(device);
2113
2114 acpi_video_bus_remove_notify_handler(video);
2115 acpi_video_bus_unregister_backlight(video);
2116 acpi_video_bus_put_devices(video);
2117
2118 mutex_lock(&video_list_lock);
2119 list_del(&video->entry);
2120 mutex_unlock(&video_list_lock);
2121
2122 kfree(video->attached_array);
2123 kfree(video);
2124
2125 return 0;
2126 }
2127
2128 static int __init is_i740(struct pci_dev *dev)
2129 {
2130 if (dev->device == 0x00D1)
2131 return 1;
2132 if (dev->device == 0x7000)
2133 return 1;
2134 return 0;
2135 }
2136
2137 static int __init intel_opregion_present(void)
2138 {
2139 int opregion = 0;
2140 struct pci_dev *dev = NULL;
2141 u32 address;
2142
2143 for_each_pci_dev(dev) {
2144 if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
2145 continue;
2146 if (dev->vendor != PCI_VENDOR_ID_INTEL)
2147 continue;
2148
2149 if (is_i740(dev))
2150 continue;
2151 pci_read_config_dword(dev, 0xfc, &address);
2152 if (!address)
2153 continue;
2154 opregion = 1;
2155 }
2156 return opregion;
2157 }
2158
2159
2160 static bool dmi_is_desktop(void)
2161 {
2162 const char *chassis_type;
2163 unsigned long type;
2164
2165 chassis_type = dmi_get_system_info(DMI_CHASSIS_TYPE);
2166 if (!chassis_type)
2167 return false;
2168
2169 if (kstrtoul(chassis_type, 10, &type) != 0)
2170 return false;
2171
2172 switch (type) {
2173 case 0x03:
2174 case 0x04:
2175 case 0x05:
2176 case 0x06:
2177 case 0x07:
2178 case 0x10:
2179 case 0x11:
2180 return true;
2181 }
2182
2183 return false;
2184 }
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196 static bool should_check_lcd_flag(void)
2197 {
2198 if (!acpi_osi_is_win8())
2199 return false;
2200
2201 if (dmi_is_desktop())
2202 return true;
2203
2204 if (acpi_reduced_hardware())
2205 return true;
2206
2207 return false;
2208 }
2209
2210 int acpi_video_register(void)
2211 {
2212 int ret = 0;
2213
2214 mutex_lock(®ister_count_mutex);
2215 if (register_count) {
2216
2217
2218
2219
2220 goto leave;
2221 }
2222
2223 if (only_lcd == -1)
2224 only_lcd = should_check_lcd_flag();
2225
2226 dmi_check_system(video_dmi_table);
2227
2228 ret = acpi_bus_register_driver(&acpi_video_bus);
2229 if (ret)
2230 goto leave;
2231
2232
2233
2234
2235
2236 register_count = 1;
2237
2238 leave:
2239 mutex_unlock(®ister_count_mutex);
2240 return ret;
2241 }
2242 EXPORT_SYMBOL(acpi_video_register);
2243
2244 void acpi_video_unregister(void)
2245 {
2246 mutex_lock(®ister_count_mutex);
2247 if (register_count) {
2248 acpi_bus_unregister_driver(&acpi_video_bus);
2249 register_count = 0;
2250 may_report_brightness_keys = false;
2251 }
2252 mutex_unlock(®ister_count_mutex);
2253 }
2254 EXPORT_SYMBOL(acpi_video_unregister);
2255
2256 void acpi_video_unregister_backlight(void)
2257 {
2258 struct acpi_video_bus *video;
2259
2260 mutex_lock(®ister_count_mutex);
2261 if (register_count) {
2262 mutex_lock(&video_list_lock);
2263 list_for_each_entry(video, &video_bus_head, entry)
2264 acpi_video_bus_unregister_backlight(video);
2265 mutex_unlock(&video_list_lock);
2266 }
2267 mutex_unlock(®ister_count_mutex);
2268 }
2269
2270 bool acpi_video_handles_brightness_key_presses(void)
2271 {
2272 return may_report_brightness_keys &&
2273 (report_key_events & REPORT_BRIGHTNESS_KEY_EVENTS);
2274 }
2275 EXPORT_SYMBOL(acpi_video_handles_brightness_key_presses);
2276
2277
2278
2279
2280
2281
2282
2283
2284 static int __init acpi_video_init(void)
2285 {
2286
2287
2288
2289
2290
2291
2292
2293
2294 if (acpi_disabled)
2295 return 0;
2296
2297 if (intel_opregion_present())
2298 return 0;
2299
2300 return acpi_video_register();
2301 }
2302
2303 static void __exit acpi_video_exit(void)
2304 {
2305 acpi_video_detect_exit();
2306 acpi_video_unregister();
2307 }
2308
2309 module_init(acpi_video_init);
2310 module_exit(acpi_video_exit);