int acpi_create_platform_device(struct acpi_device *adev,
                                const struct acpi_device_id *id);
 
+/*--------------------------------------------------------------------------
+                                       Video
+  -------------------------------------------------------------------------- */
+#if defined(CONFIG_ACPI_VIDEO) || defined(CONFIG_ACPI_VIDEO_MODULE)
+bool acpi_video_backlight_quirks(void);
+bool acpi_video_verify_backlight_support(void);
+#else
+static inline bool acpi_video_backlight_quirks(void) { return false; }
+static inline bool acpi_video_verify_backlight_support(void) { return false; }
+#endif
+
 #endif /* _ACPI_INTERNAL_H_ */
 
 #include <linux/suspend.h>
 #include <acpi/video.h>
 
+#include "internal.h"
+
 #define PREFIX "ACPI: "
 
 #define ACPI_VIDEO_BUS_NAME            "Video Bus"
        if (acpi_video_init_brightness(device))
                return;
 
-       if (acpi_video_backlight_support()) {
+       if (acpi_video_verify_backlight_support()) {
                struct backlight_properties props;
                struct pci_dev *pdev;
                acpi_handle acpi_parent;
        unsigned long long level_current, level_next;
        int result = -EINVAL;
 
-       /* no warning message if acpi_backlight=vendor is used */
-       if (!acpi_video_backlight_support())
+       /* no warning message if acpi_backlight=vendor or a quirk is used */
+       if (!acpi_video_verify_backlight_support())
                return 0;
 
        if (!device->brightness)
        return 0;
 }
 
+static acpi_status video_unregister_backlight(acpi_handle handle, u32 lvl,
+                                             void *context, void **rv)
+{
+       struct acpi_device *acpi_dev;
+       struct acpi_video_bus *video;
+       struct acpi_video_device *dev, *next;
+
+       if (acpi_bus_get_device(handle, &acpi_dev))
+               return AE_OK;
+
+       if (acpi_match_device_ids(acpi_dev, video_device_ids))
+               return AE_OK;
+
+       video = acpi_driver_data(acpi_dev);
+       if (!video)
+               return AE_OK;
+
+       acpi_video_bus_stop_devices(video);
+       mutex_lock(&video->device_list_lock);
+       list_for_each_entry_safe(dev, next, &video->video_device_list, entry) {
+               if (dev->backlight) {
+                       backlight_device_unregister(dev->backlight);
+                       dev->backlight = NULL;
+                       kfree(dev->brightness->levels);
+                       kfree(dev->brightness);
+               }
+               if (dev->cooling_dev) {
+                       sysfs_remove_link(&dev->dev->dev.kobj,
+                                         "thermal_cooling");
+                       sysfs_remove_link(&dev->cooling_dev->device.kobj,
+                                         "device");
+                       thermal_cooling_device_unregister(dev->cooling_dev);
+                       dev->cooling_dev = NULL;
+               }
+       }
+       mutex_unlock(&video->device_list_lock);
+       acpi_video_bus_start_devices(video);
+       return AE_OK;
+}
+
 static int __init is_i740(struct pci_dev *dev)
 {
        if (dev->device == 0x00D1)
        return opregion;
 }
 
-int acpi_video_register(void)
+int __acpi_video_register(bool backlight_quirks)
 {
-       int result = 0;
+       bool no_backlight;
+       int result;
+
+       no_backlight = backlight_quirks ? acpi_video_backlight_quirks() : false;
+
        if (register_count) {
                /*
-                * if the function of acpi_video_register is already called,
-                * don't register the acpi_vide_bus again and return no error.
+                * If acpi_video_register() has been called already, don't try
+                * to register acpi_video_bus, but unregister backlight devices
+                * if no backlight support is requested.
                 */
+               if (no_backlight)
+                       acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
+                                           ACPI_UINT32_MAX,
+                                           video_unregister_backlight,
+                                           NULL, NULL, NULL);
+
                return 0;
        }
 
 
        return 0;
 }
-EXPORT_SYMBOL(acpi_video_register);
+EXPORT_SYMBOL(__acpi_video_register);
 
 void acpi_video_unregister(void)
 {
 
 #include <linux/dmi.h>
 #include <linux/pci.h>
 
+#include "internal.h"
+
 #define PREFIX "ACPI: "
 
 ACPI_MODULE_NAME("video");
                acpi_video_get_capabilities(NULL);
 }
 
+bool acpi_video_backlight_quirks(void)
+{
+       if (acpi_gbl_osi_data >= ACPI_OSI_WIN_8) {
+               acpi_video_caps_check();
+               acpi_video_support |= ACPI_VIDEO_SKIP_BACKLIGHT;
+               return true;
+       }
+       return false;
+}
+EXPORT_SYMBOL(acpi_video_backlight_quirks);
+
 /* Promote the vendor interface instead of the generic video module.
  * This function allow DMI blacklists to be implemented by externals
  * platform drivers instead of putting a big blacklist in video_detect.c
 }
 EXPORT_SYMBOL(acpi_video_backlight_support);
 
+/* For the ACPI video driver use only. */
+bool acpi_video_verify_backlight_support(void)
+{
+       return (acpi_video_support & ACPI_VIDEO_SKIP_BACKLIGHT) ?
+               false : acpi_video_backlight_support();
+}
+EXPORT_SYMBOL(acpi_video_verify_backlight_support);
+
 /*
  * Use acpi_backlight=vendor/video to force that backlight switching
  * is processed by vendor specific acpi drivers or video.ko driver.
 
 #define ACPI_VIDEO_DISPLAY_LEGACY_TV      0x0200
 
 #if (defined CONFIG_ACPI_VIDEO || defined CONFIG_ACPI_VIDEO_MODULE)
-extern int acpi_video_register(void);
+extern int __acpi_video_register(bool backlight_quirks);
+static inline int acpi_video_register(void)
+{
+       return __acpi_video_register(false);
+}
+static inline int acpi_video_register_with_quirks(void)
+{
+       return __acpi_video_register(true);
+}
 extern void acpi_video_unregister(void);
 extern int acpi_video_get_edid(struct acpi_device *device, int type,
                               int device_id, void **edid);
 #else
 static inline int acpi_video_register(void) { return 0; }
+static inline int acpi_video_register_with_quirks(void) { return 0; }
 static inline void acpi_video_unregister(void) { return; }
 static inline int acpi_video_get_edid(struct acpi_device *device, int type,
                                      int device_id, void **edid)