3030#include <linux/uaccess.h>
3131#include <linux/string_choices.h>
3232
33- #define ACPI_VIDEO_BUS_NAME "Video Bus"
34- #define ACPI_VIDEO_DEVICE_NAME "Video Device"
35-
3633#define MAX_NAME_LEN 20
3734
3835MODULE_AUTHOR ("Bruno Ducrot" );
@@ -1144,9 +1141,6 @@ static int acpi_video_bus_get_one_device(struct acpi_device *device, void *arg)
11441141 return - ENOMEM ;
11451142 }
11461143
1147- strscpy (acpi_device_name (device ), ACPI_VIDEO_DEVICE_NAME );
1148- strscpy (acpi_device_class (device ), ACPI_VIDEO_CLASS );
1149-
11501144 data -> device_id = device_id ;
11511145 data -> video = video ;
11521146 data -> dev = device ;
@@ -1570,7 +1564,8 @@ static void acpi_video_bus_notify(acpi_handle handle, u32 event, void *data)
15701564 break ;
15711565 }
15721566
1573- if (acpi_notifier_call_chain (device , event , 0 ))
1567+ if (acpi_notifier_call_chain (ACPI_VIDEO_CLASS , acpi_device_bid (device ),
1568+ event , 0 ))
15741569 /* Something vetoed the keypress. */
15751570 keycode = 0 ;
15761571
@@ -1611,7 +1606,8 @@ static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)
16111606 if (video_device -> backlight )
16121607 backlight_force_update (video_device -> backlight ,
16131608 BACKLIGHT_UPDATE_HOTKEY );
1614- acpi_notifier_call_chain (device , event , 0 );
1609+ acpi_notifier_call_chain (ACPI_VIDEO_CLASS , acpi_device_bid (device ),
1610+ event , 0 );
16151611 return ;
16161612 }
16171613
@@ -1644,7 +1640,8 @@ static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)
16441640 if (keycode )
16451641 may_report_brightness_keys = true;
16461642
1647- acpi_notifier_call_chain (device , event , 0 );
1643+ acpi_notifier_call_chain (ACPI_VIDEO_CLASS , acpi_device_bid (device ),
1644+ event , 0 );
16481645
16491646 if (keycode && (report_key_events & REPORT_BRIGHTNESS_KEY_EVENTS )) {
16501647 input_report_key (input , keycode , 1 );
@@ -1681,26 +1678,6 @@ static int acpi_video_resume(struct notifier_block *nb,
16811678 return NOTIFY_DONE ;
16821679}
16831680
1684- static acpi_status
1685- acpi_video_bus_match (acpi_handle handle , u32 level , void * context ,
1686- void * * return_value )
1687- {
1688- struct acpi_device * device = context ;
1689- struct acpi_device * sibling ;
1690-
1691- if (handle == device -> handle )
1692- return AE_CTRL_TERMINATE ;
1693-
1694- sibling = acpi_fetch_acpi_dev (handle );
1695- if (!sibling )
1696- return AE_OK ;
1697-
1698- if (!strcmp (acpi_device_name (sibling ), ACPI_VIDEO_BUS_NAME ))
1699- return AE_ALREADY_EXISTS ;
1700-
1701- return AE_OK ;
1702- }
1703-
17041681static void acpi_video_dev_register_backlight (struct acpi_video_device * device )
17051682{
17061683 struct backlight_properties props ;
@@ -1902,7 +1879,7 @@ static int acpi_video_bus_add_notify_handler(struct acpi_video_bus *video,
19021879 snprintf (video -> phys , sizeof (video -> phys ),
19031880 "%s/video/input0" , acpi_device_hid (video -> device ));
19041881
1905- input -> name = acpi_device_name ( video -> device ) ;
1882+ input -> name = "Video Bus" ;
19061883 input -> phys = video -> phys ;
19071884 input -> id .bustype = BUS_HOST ;
19081885 input -> id .product = 0x06 ;
@@ -1976,53 +1953,69 @@ static int acpi_video_bus_put_devices(struct acpi_video_bus *video)
19761953 return 0 ;
19771954}
19781955
1979- static int instance ;
1956+ static int duplicate_dev_check (struct device * sibling , void * data )
1957+ {
1958+ struct acpi_video_bus * video ;
1959+
1960+ if (sibling == data || !dev_is_auxiliary (sibling ))
1961+ return 0 ;
1962+
1963+ guard (mutex )(& video_list_lock );
1964+
1965+ list_for_each_entry (video , & video_bus_head , entry ) {
1966+ if (video == dev_get_drvdata (sibling ))
1967+ return - EEXIST ;
1968+ }
1969+
1970+ return 0 ;
1971+ }
1972+
1973+ static bool acpi_video_bus_dev_is_duplicate (struct device * dev )
1974+ {
1975+ return device_for_each_child (dev -> parent , dev , duplicate_dev_check );
1976+ }
19801977
19811978static int acpi_video_bus_probe (struct auxiliary_device * aux_dev ,
19821979 const struct auxiliary_device_id * id_unused )
19831980{
19841981 struct acpi_device * device = ACPI_COMPANION (& aux_dev -> dev );
1982+ static DEFINE_MUTEX (probe_lock );
19851983 struct acpi_video_bus * video ;
1984+ static int instance ;
19861985 bool auto_detect ;
19871986 int error ;
1988- acpi_status status ;
19891987
1990- status = acpi_walk_namespace (ACPI_TYPE_DEVICE ,
1991- acpi_dev_parent (device )-> handle , 1 ,
1992- acpi_video_bus_match , NULL ,
1993- device , NULL );
1994- if (status == AE_ALREADY_EXISTS ) {
1988+ /* Probe one video bus device at a time in case there are duplicates. */
1989+ guard (mutex )(& probe_lock );
1990+
1991+ if (!allow_duplicates && acpi_video_bus_dev_is_duplicate (& aux_dev -> dev )) {
19951992 pr_info (FW_BUG
19961993 "Duplicate ACPI video bus devices for the"
19971994 " same VGA controller, please try module "
19981995 "parameter \"video.allow_duplicates=1\""
19991996 "if the current driver doesn't work.\n" );
2000- if (!allow_duplicates )
2001- return - ENODEV ;
1997+ return - ENODEV ;
20021998 }
20031999
20042000 video = kzalloc_obj (struct acpi_video_bus );
20052001 if (!video )
20062002 return - ENOMEM ;
20072003
2008- /* a hack to fix the duplicate name "VID" problem on T61 */
2009- if (!strcmp (device -> pnp .bus_id , "VID" )) {
2010- if (instance )
2011- device -> pnp .bus_id [3 ] = '0' + instance ;
2012- instance ++ ;
2013- }
2014- /* a hack to fix the duplicate name "VGA" problem on Pa 3553 */
2015- if (!strcmp (device -> pnp .bus_id , "VGA" )) {
2004+ /*
2005+ * A hack to fix the duplicate name "VID" problem on T61 and the
2006+ * duplicate name "VGA" problem on Pa 3553.
2007+ */
2008+ if (!strcmp (device -> pnp .bus_id , "VID" ) ||
2009+ !strcmp (device -> pnp .bus_id , "VGA" )) {
20162010 if (instance )
20172011 device -> pnp .bus_id [3 ] = '0' + instance ;
2012+
20182013 instance ++ ;
20192014 }
20202015
20212016 auxiliary_set_drvdata (aux_dev , video );
20222017
20232018 video -> device = device ;
2024- strscpy (acpi_device_name (device ), ACPI_VIDEO_BUS_NAME );
2025- strscpy (acpi_device_class (device ), ACPI_VIDEO_CLASS );
20262019 device -> driver_data = video ;
20272020
20282021 acpi_video_bus_find_cap (video );
@@ -2043,11 +2036,10 @@ static int acpi_video_bus_probe(struct auxiliary_device *aux_dev,
20432036 */
20442037 acpi_device_fix_up_power_children (device );
20452038
2046- pr_info ("%s [%s] (multi-head: %s rom: %s post: %s)\n" ,
2047- ACPI_VIDEO_DEVICE_NAME , acpi_device_bid (device ),
2048- str_yes_no (video -> flags .multihead ),
2049- str_yes_no (video -> flags .rom ),
2050- str_yes_no (video -> flags .post ));
2039+ pr_info ("Video Device [%s] (multi-head: %s rom: %s post: %s)\n" ,
2040+ acpi_device_bid (device ), str_yes_no (video -> flags .multihead ),
2041+ str_yes_no (video -> flags .rom ), str_yes_no (video -> flags .post ));
2042+
20512043 mutex_lock (& video_list_lock );
20522044 list_add_tail (& video -> entry , & video_bus_head );
20532045 mutex_unlock (& video_list_lock );
0 commit comments