LCOV - code coverage report
Current view: top level - drivers/acpi - video_detect.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 72 0.0 %
Date: 2022-04-01 14:17:54 Functions: 0 11 0.0 %
Branches: 0 38 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  *  Copyright (C) 2015       Red Hat Inc.
       3                 :            :  *                           Hans de Goede <hdegoede@redhat.com>
       4                 :            :  *  Copyright (C) 2008       SuSE Linux Products GmbH
       5                 :            :  *                           Thomas Renninger <trenn@suse.de>
       6                 :            :  *
       7                 :            :  *  May be copied or modified under the terms of the GNU General Public License
       8                 :            :  *
       9                 :            :  * video_detect.c:
      10                 :            :  * After PCI devices are glued with ACPI devices
      11                 :            :  * acpi_get_pci_dev() can be called to identify ACPI graphics
      12                 :            :  * devices for which a real graphics card is plugged in
      13                 :            :  *
      14                 :            :  * Depending on whether ACPI graphics extensions (cmp. ACPI spec Appendix B)
      15                 :            :  * are available, video.ko should be used to handle the device.
      16                 :            :  *
      17                 :            :  * Otherwise vendor specific drivers like thinkpad_acpi, asus-laptop,
      18                 :            :  * sony_acpi,... can take care about backlight brightness.
      19                 :            :  *
      20                 :            :  * Backlight drivers can use acpi_video_get_backlight_type() to determine
      21                 :            :  * which driver should handle the backlight.
      22                 :            :  *
      23                 :            :  * If CONFIG_ACPI_VIDEO is neither set as "compiled in" (y) nor as a module (m)
      24                 :            :  * this file will not be compiled and acpi_video_get_backlight_type() will
      25                 :            :  * always return acpi_backlight_vendor.
      26                 :            :  */
      27                 :            : 
      28                 :            : #include <linux/export.h>
      29                 :            : #include <linux/acpi.h>
      30                 :            : #include <linux/backlight.h>
      31                 :            : #include <linux/dmi.h>
      32                 :            : #include <linux/module.h>
      33                 :            : #include <linux/pci.h>
      34                 :            : #include <linux/types.h>
      35                 :            : #include <linux/workqueue.h>
      36                 :            : #include <acpi/video.h>
      37                 :            : 
      38                 :            : ACPI_MODULE_NAME("video");
      39                 :            : #define _COMPONENT              ACPI_VIDEO_COMPONENT
      40                 :            : 
      41                 :            : void acpi_video_unregister_backlight(void);
      42                 :            : 
      43                 :            : static bool backlight_notifier_registered;
      44                 :            : static struct notifier_block backlight_nb;
      45                 :            : static struct work_struct backlight_notify_work;
      46                 :            : 
      47                 :            : static enum acpi_backlight_type acpi_backlight_cmdline = acpi_backlight_undef;
      48                 :            : static enum acpi_backlight_type acpi_backlight_dmi = acpi_backlight_undef;
      49                 :            : 
      50                 :          0 : static void acpi_video_parse_cmdline(void)
      51                 :            : {
      52         [ #  # ]:          0 :         if (!strcmp("vendor", acpi_video_backlight_string))
      53                 :          0 :                 acpi_backlight_cmdline = acpi_backlight_vendor;
      54         [ #  # ]:          0 :         if (!strcmp("video", acpi_video_backlight_string))
      55                 :          0 :                 acpi_backlight_cmdline = acpi_backlight_video;
      56         [ #  # ]:          0 :         if (!strcmp("native", acpi_video_backlight_string))
      57                 :          0 :                 acpi_backlight_cmdline = acpi_backlight_native;
      58         [ #  # ]:          0 :         if (!strcmp("none", acpi_video_backlight_string))
      59                 :          0 :                 acpi_backlight_cmdline = acpi_backlight_none;
      60                 :          0 : }
      61                 :            : 
      62                 :            : static acpi_status
      63                 :          0 : find_video(acpi_handle handle, u32 lvl, void *context, void **rv)
      64                 :            : {
      65                 :          0 :         long *cap = context;
      66                 :          0 :         struct pci_dev *dev;
      67                 :          0 :         struct acpi_device *acpi_dev;
      68                 :            : 
      69                 :          0 :         static const struct acpi_device_id video_ids[] = {
      70                 :            :                 {ACPI_VIDEO_HID, 0},
      71                 :            :                 {"", 0},
      72                 :            :         };
      73         [ #  # ]:          0 :         if (acpi_bus_get_device(handle, &acpi_dev))
      74                 :            :                 return AE_OK;
      75                 :            : 
      76         [ #  # ]:          0 :         if (!acpi_match_device_ids(acpi_dev, video_ids)) {
      77                 :          0 :                 dev = acpi_get_pci_dev(handle);
      78         [ #  # ]:          0 :                 if (!dev)
      79                 :            :                         return AE_OK;
      80                 :          0 :                 pci_dev_put(dev);
      81                 :          0 :                 *cap |= acpi_is_video_device(handle);
      82                 :            :         }
      83                 :            :         return AE_OK;
      84                 :            : }
      85                 :            : 
      86                 :            : /* Force to use vendor driver when the ACPI device is known to be
      87                 :            :  * buggy */
      88                 :          0 : static int video_detect_force_vendor(const struct dmi_system_id *d)
      89                 :            : {
      90                 :          0 :         acpi_backlight_dmi = acpi_backlight_vendor;
      91                 :          0 :         return 0;
      92                 :            : }
      93                 :            : 
      94                 :          0 : static int video_detect_force_video(const struct dmi_system_id *d)
      95                 :            : {
      96                 :          0 :         acpi_backlight_dmi = acpi_backlight_video;
      97                 :          0 :         return 0;
      98                 :            : }
      99                 :            : 
     100                 :          0 : static int video_detect_force_native(const struct dmi_system_id *d)
     101                 :            : {
     102                 :          0 :         acpi_backlight_dmi = acpi_backlight_native;
     103                 :          0 :         return 0;
     104                 :            : }
     105                 :            : 
     106                 :          0 : static int video_detect_force_none(const struct dmi_system_id *d)
     107                 :            : {
     108                 :          0 :         acpi_backlight_dmi = acpi_backlight_none;
     109                 :          0 :         return 0;
     110                 :            : }
     111                 :            : 
     112                 :            : static const struct dmi_system_id video_detect_dmi_table[] = {
     113                 :            :         /* On Samsung X360, the BIOS will set a flag (VDRV) if generic
     114                 :            :          * ACPI backlight device is used. This flag will definitively break
     115                 :            :          * the backlight interface (even the vendor interface) until next
     116                 :            :          * reboot. It's why we should prevent video.ko from being used here
     117                 :            :          * and we can't rely on a later call to acpi_video_unregister().
     118                 :            :          */
     119                 :            :         {
     120                 :            :          .callback = video_detect_force_vendor,
     121                 :            :          .ident = "X360",
     122                 :            :          .matches = {
     123                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
     124                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "X360"),
     125                 :            :                 DMI_MATCH(DMI_BOARD_NAME, "X360"),
     126                 :            :                 },
     127                 :            :         },
     128                 :            :         {
     129                 :            :         .callback = video_detect_force_vendor,
     130                 :            :         .ident = "Asus UL30VT",
     131                 :            :         .matches = {
     132                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
     133                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "UL30VT"),
     134                 :            :                 },
     135                 :            :         },
     136                 :            :         {
     137                 :            :         .callback = video_detect_force_vendor,
     138                 :            :         .ident = "Asus UL30A",
     139                 :            :         .matches = {
     140                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
     141                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "UL30A"),
     142                 :            :                 },
     143                 :            :         },
     144                 :            :         {
     145                 :            :         .callback = video_detect_force_vendor,
     146                 :            :         .ident = "Sony VPCEH3U1E",
     147                 :            :         .matches = {
     148                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
     149                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "VPCEH3U1E"),
     150                 :            :                 },
     151                 :            :         },
     152                 :            : 
     153                 :            :         /*
     154                 :            :          * These models have a working acpi_video backlight control, and using
     155                 :            :          * native backlight causes a regression where backlight does not work
     156                 :            :          * when userspace is not handling brightness key events. Disable
     157                 :            :          * native_backlight on these to fix this:
     158                 :            :          * https://bugzilla.kernel.org/show_bug.cgi?id=81691
     159                 :            :          */
     160                 :            :         {
     161                 :            :          .callback = video_detect_force_video,
     162                 :            :          .ident = "ThinkPad T420",
     163                 :            :          .matches = {
     164                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
     165                 :            :                 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T420"),
     166                 :            :                 },
     167                 :            :         },
     168                 :            :         {
     169                 :            :          .callback = video_detect_force_video,
     170                 :            :          .ident = "ThinkPad T520",
     171                 :            :          .matches = {
     172                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
     173                 :            :                 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T520"),
     174                 :            :                 },
     175                 :            :         },
     176                 :            :         {
     177                 :            :          .callback = video_detect_force_video,
     178                 :            :          .ident = "ThinkPad X201s",
     179                 :            :          .matches = {
     180                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
     181                 :            :                 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
     182                 :            :                 },
     183                 :            :         },
     184                 :            :         {
     185                 :            :          .callback = video_detect_force_video,
     186                 :            :          .ident = "ThinkPad X201T",
     187                 :            :          .matches = {
     188                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
     189                 :            :                 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201T"),
     190                 :            :                 },
     191                 :            :         },
     192                 :            : 
     193                 :            :         /* The native backlight controls do not work on some older machines */
     194                 :            :         {
     195                 :            :          /* https://bugs.freedesktop.org/show_bug.cgi?id=81515 */
     196                 :            :          .callback = video_detect_force_video,
     197                 :            :          .ident = "HP ENVY 15 Notebook",
     198                 :            :          .matches = {
     199                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
     200                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "HP ENVY 15 Notebook PC"),
     201                 :            :                 },
     202                 :            :         },
     203                 :            :         {
     204                 :            :          .callback = video_detect_force_video,
     205                 :            :          .ident = "SAMSUNG 870Z5E/880Z5E/680Z5E",
     206                 :            :          .matches = {
     207                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
     208                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "870Z5E/880Z5E/680Z5E"),
     209                 :            :                 },
     210                 :            :         },
     211                 :            :         {
     212                 :            :          .callback = video_detect_force_video,
     213                 :            :          .ident = "SAMSUNG 370R4E/370R4V/370R5E/3570RE/370R5V",
     214                 :            :          .matches = {
     215                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
     216                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME,
     217                 :            :                           "370R4E/370R4V/370R5E/3570RE/370R5V"),
     218                 :            :                 },
     219                 :            :         },
     220                 :            :         {
     221                 :            :          /* https://bugzilla.redhat.com/show_bug.cgi?id=1186097 */
     222                 :            :          .callback = video_detect_force_video,
     223                 :            :          .ident = "SAMSUNG 3570R/370R/470R/450R/510R/4450RV",
     224                 :            :          .matches = {
     225                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
     226                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME,
     227                 :            :                           "3570R/370R/470R/450R/510R/4450RV"),
     228                 :            :                 },
     229                 :            :         },
     230                 :            :         {
     231                 :            :          /* https://bugzilla.redhat.com/show_bug.cgi?id=1557060 */
     232                 :            :          .callback = video_detect_force_video,
     233                 :            :          .ident = "SAMSUNG 670Z5E",
     234                 :            :          .matches = {
     235                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
     236                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "670Z5E"),
     237                 :            :                 },
     238                 :            :         },
     239                 :            :         {
     240                 :            :          /* https://bugzilla.redhat.com/show_bug.cgi?id=1094948 */
     241                 :            :          .callback = video_detect_force_video,
     242                 :            :          .ident = "SAMSUNG 730U3E/740U3E",
     243                 :            :          .matches = {
     244                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
     245                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "730U3E/740U3E"),
     246                 :            :                 },
     247                 :            :         },
     248                 :            :         {
     249                 :            :          /* https://bugs.freedesktop.org/show_bug.cgi?id=87286 */
     250                 :            :          .callback = video_detect_force_video,
     251                 :            :          .ident = "SAMSUNG 900X3C/900X3D/900X3E/900X4C/900X4D",
     252                 :            :          .matches = {
     253                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
     254                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME,
     255                 :            :                           "900X3C/900X3D/900X3E/900X4C/900X4D"),
     256                 :            :                 },
     257                 :            :         },
     258                 :            :         {
     259                 :            :          /* https://bugzilla.redhat.com/show_bug.cgi?id=1272633 */
     260                 :            :          .callback = video_detect_force_video,
     261                 :            :          .ident = "Dell XPS14 L421X",
     262                 :            :          .matches = {
     263                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
     264                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"),
     265                 :            :                 },
     266                 :            :         },
     267                 :            :         {
     268                 :            :          /* https://bugzilla.redhat.com/show_bug.cgi?id=1163574 */
     269                 :            :          .callback = video_detect_force_video,
     270                 :            :          .ident = "Dell XPS15 L521X",
     271                 :            :          .matches = {
     272                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
     273                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "XPS L521X"),
     274                 :            :                 },
     275                 :            :         },
     276                 :            :         {
     277                 :            :          /* https://bugzilla.kernel.org/show_bug.cgi?id=108971 */
     278                 :            :          .callback = video_detect_force_video,
     279                 :            :          .ident = "SAMSUNG 530U4E/540U4E",
     280                 :            :          .matches = {
     281                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
     282                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "530U4E/540U4E"),
     283                 :            :                 },
     284                 :            :         },
     285                 :            : 
     286                 :            :         /* Non win8 machines which need native backlight nevertheless */
     287                 :            :         {
     288                 :            :          /* https://bugzilla.redhat.com/show_bug.cgi?id=1201530 */
     289                 :            :          .callback = video_detect_force_native,
     290                 :            :          .ident = "Lenovo Ideapad S405",
     291                 :            :          .matches = {
     292                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
     293                 :            :                 DMI_MATCH(DMI_BOARD_NAME, "Lenovo IdeaPad S405"),
     294                 :            :                 },
     295                 :            :         },
     296                 :            :         {
     297                 :            :          /* https://bugzilla.redhat.com/show_bug.cgi?id=1187004 */
     298                 :            :          .callback = video_detect_force_native,
     299                 :            :          .ident = "Lenovo Ideapad Z570",
     300                 :            :          .matches = {
     301                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
     302                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "102434U"),
     303                 :            :                 },
     304                 :            :         },
     305                 :            :         {
     306                 :            :          .callback = video_detect_force_native,
     307                 :            :          .ident = "Lenovo E41-25",
     308                 :            :          .matches = {
     309                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
     310                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "81FS"),
     311                 :            :                 },
     312                 :            :         },
     313                 :            :         {
     314                 :            :          .callback = video_detect_force_native,
     315                 :            :          .ident = "Lenovo E41-45",
     316                 :            :          .matches = {
     317                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
     318                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "82BK"),
     319                 :            :                 },
     320                 :            :         },
     321                 :            :         {
     322                 :            :          /* https://bugzilla.redhat.com/show_bug.cgi?id=1217249 */
     323                 :            :          .callback = video_detect_force_native,
     324                 :            :          .ident = "Apple MacBook Pro 12,1",
     325                 :            :          .matches = {
     326                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
     327                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro12,1"),
     328                 :            :                 },
     329                 :            :         },
     330                 :            :         {
     331                 :            :          .callback = video_detect_force_native,
     332                 :            :          .ident = "Dell Vostro V131",
     333                 :            :          .matches = {
     334                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
     335                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"),
     336                 :            :                 },
     337                 :            :         },
     338                 :            :         {
     339                 :            :          /* https://bugzilla.redhat.com/show_bug.cgi?id=1123661 */
     340                 :            :          .callback = video_detect_force_native,
     341                 :            :          .ident = "Dell XPS 17 L702X",
     342                 :            :          .matches = {
     343                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
     344                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "Dell System XPS L702X"),
     345                 :            :                 },
     346                 :            :         },
     347                 :            :         {
     348                 :            :          .callback = video_detect_force_native,
     349                 :            :          .ident = "Dell Precision 7510",
     350                 :            :          .matches = {
     351                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
     352                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "Precision 7510"),
     353                 :            :                 },
     354                 :            :         },
     355                 :            : 
     356                 :            :         /*
     357                 :            :          * Desktops which falsely report a backlight and which our heuristics
     358                 :            :          * for this do not catch.
     359                 :            :          */
     360                 :            :         {
     361                 :            :          .callback = video_detect_force_none,
     362                 :            :          .ident = "Dell OptiPlex 9020M",
     363                 :            :          .matches = {
     364                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
     365                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 9020M"),
     366                 :            :                 },
     367                 :            :         },
     368                 :            :         {
     369                 :            :          .callback = video_detect_force_none,
     370                 :            :          .ident = "MSI MS-7721",
     371                 :            :          .matches = {
     372                 :            :                 DMI_MATCH(DMI_SYS_VENDOR, "MSI"),
     373                 :            :                 DMI_MATCH(DMI_PRODUCT_NAME, "MS-7721"),
     374                 :            :                 },
     375                 :            :         },
     376                 :            :         { },
     377                 :            : };
     378                 :            : 
     379                 :            : /* This uses a workqueue to avoid various locking ordering issues */
     380                 :          0 : static void acpi_video_backlight_notify_work(struct work_struct *work)
     381                 :            : {
     382         [ #  # ]:          0 :         if (acpi_video_get_backlight_type() != acpi_backlight_video)
     383                 :          0 :                 acpi_video_unregister_backlight();
     384                 :          0 : }
     385                 :            : 
     386                 :          0 : static int acpi_video_backlight_notify(struct notifier_block *nb,
     387                 :            :                                        unsigned long val, void *bd)
     388                 :            : {
     389                 :          0 :         struct backlight_device *backlight = bd;
     390                 :            : 
     391                 :            :         /* A raw bl registering may change video -> native */
     392   [ #  #  #  # ]:          0 :         if (backlight->props.type == BACKLIGHT_RAW &&
     393                 :            :             val == BACKLIGHT_REGISTERED)
     394                 :          0 :                 schedule_work(&backlight_notify_work);
     395                 :            : 
     396                 :          0 :         return NOTIFY_OK;
     397                 :            : }
     398                 :            : 
     399                 :            : /*
     400                 :            :  * Determine which type of backlight interface to use on this system,
     401                 :            :  * First check cmdline, then dmi quirks, then do autodetect.
     402                 :            :  *
     403                 :            :  * The autodetect order is:
     404                 :            :  * 1) Is the acpi-video backlight interface supported ->
     405                 :            :  *  no, use a vendor interface
     406                 :            :  * 2) Is this a win8 "ready" BIOS and do we have a native interface ->
     407                 :            :  *  yes, use a native interface
     408                 :            :  * 3) Else use the acpi-video interface
     409                 :            :  *
     410                 :            :  * Arguably the native on win8 check should be done first, but that would
     411                 :            :  * be a behavior change, which may causes issues.
     412                 :            :  */
     413                 :          0 : enum acpi_backlight_type acpi_video_get_backlight_type(void)
     414                 :            : {
     415                 :          0 :         static DEFINE_MUTEX(init_mutex);
     416                 :          0 :         static bool init_done;
     417                 :          0 :         static long video_caps;
     418                 :            : 
     419                 :            :         /* Parse cmdline, dmi and acpi only once */
     420                 :          0 :         mutex_lock(&init_mutex);
     421         [ #  # ]:          0 :         if (!init_done) {
     422                 :          0 :                 acpi_video_parse_cmdline();
     423                 :          0 :                 dmi_check_system(video_detect_dmi_table);
     424                 :          0 :                 acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
     425                 :            :                                     ACPI_UINT32_MAX, find_video, NULL,
     426                 :            :                                     &video_caps, NULL);
     427                 :          0 :                 INIT_WORK(&backlight_notify_work,
     428                 :            :                           acpi_video_backlight_notify_work);
     429                 :          0 :                 backlight_nb.notifier_call = acpi_video_backlight_notify;
     430                 :          0 :                 backlight_nb.priority = 0;
     431         [ #  # ]:          0 :                 if (backlight_register_notifier(&backlight_nb) == 0)
     432                 :          0 :                         backlight_notifier_registered = true;
     433                 :          0 :                 init_done = true;
     434                 :            :         }
     435                 :          0 :         mutex_unlock(&init_mutex);
     436                 :            : 
     437         [ #  # ]:          0 :         if (acpi_backlight_cmdline != acpi_backlight_undef)
     438                 :            :                 return acpi_backlight_cmdline;
     439                 :            : 
     440         [ #  # ]:          0 :         if (acpi_backlight_dmi != acpi_backlight_undef)
     441                 :            :                 return acpi_backlight_dmi;
     442                 :            : 
     443         [ #  # ]:          0 :         if (!(video_caps & ACPI_VIDEO_BACKLIGHT))
     444                 :            :                 return acpi_backlight_vendor;
     445                 :            : 
     446   [ #  #  #  # ]:          0 :         if (acpi_osi_is_win8() && backlight_device_get_by_type(BACKLIGHT_RAW))
     447                 :          0 :                 return acpi_backlight_native;
     448                 :            : 
     449                 :            :         return acpi_backlight_video;
     450                 :            : }
     451                 :            : EXPORT_SYMBOL(acpi_video_get_backlight_type);
     452                 :            : 
     453                 :            : /*
     454                 :            :  * Set the preferred backlight interface type based on DMI info.
     455                 :            :  * This function allows DMI blacklists to be implemented by external
     456                 :            :  * platform drivers instead of putting a big blacklist in video_detect.c
     457                 :            :  */
     458                 :          0 : void acpi_video_set_dmi_backlight_type(enum acpi_backlight_type type)
     459                 :            : {
     460                 :          0 :         acpi_backlight_dmi = type;
     461                 :            :         /* Remove acpi-video backlight interface if it is no longer desired */
     462         [ #  # ]:          0 :         if (acpi_video_get_backlight_type() != acpi_backlight_video)
     463                 :          0 :                 acpi_video_unregister_backlight();
     464                 :          0 : }
     465                 :            : EXPORT_SYMBOL(acpi_video_set_dmi_backlight_type);
     466                 :            : 
     467                 :          0 : void __exit acpi_video_detect_exit(void)
     468                 :            : {
     469         [ #  # ]:          0 :         if (backlight_notifier_registered)
     470                 :          0 :                 backlight_unregister_notifier(&backlight_nb);
     471                 :          0 : }

Generated by: LCOV version 1.14