@@ -1298,18 +1298,18 @@ static int wacom_remote_create_attr_group(struct wacom *wacom, __u32 serial,
12981298 int index )
12991299{
13001300 int error = 0 ;
1301- struct wacom_wac * wacom_wac = & wacom -> wacom_wac ;
1301+ struct wacom_remote * remote = wacom -> remote ;
13021302
1303- wacom_wac -> serial [index ] = serial ;
1303+ remote -> serial [index ] = serial ;
13041304
1305- wacom -> remote_group [index ].name = devm_kasprintf (& wacom -> hdev -> dev ,
1306- GFP_KERNEL ,
1307- "%d" , serial );
1308- if (!wacom -> remote_group [index ].name )
1305+ remote -> remote_group [index ].name = devm_kasprintf (& wacom -> hdev -> dev ,
1306+ GFP_KERNEL ,
1307+ "%d" , serial );
1308+ if (!remote -> remote_group [index ].name )
13091309 return - ENOMEM ;
13101310
1311- error = sysfs_create_group (wacom -> remote_dir ,
1312- & wacom -> remote_group [index ]);
1311+ error = sysfs_create_group (remote -> remote_dir ,
1312+ & remote -> remote_group [index ]);
13131313 if (error ) {
13141314 hid_err (wacom -> hdev ,
13151315 "cannot create sysfs group err: %d\n" , error );
@@ -1321,22 +1321,22 @@ static int wacom_remote_create_attr_group(struct wacom *wacom, __u32 serial,
13211321
13221322static void wacom_remote_destroy_attr_group (struct wacom * wacom , __u32 serial )
13231323{
1324- struct wacom_wac * wacom_wac = & wacom -> wacom_wac ;
1324+ struct wacom_remote * remote = wacom -> remote ;
13251325 int i ;
13261326
13271327 if (!serial )
13281328 return ;
13291329
13301330 for (i = 0 ; i < WACOM_MAX_REMOTES ; i ++ ) {
1331- if (wacom_wac -> serial [i ] == serial ) {
1332- wacom_wac -> serial [i ] = 0 ;
1331+ if (remote -> serial [i ] == serial ) {
1332+ remote -> serial [i ] = 0 ;
13331333 wacom -> led .groups [i ].select = WACOM_STATUS_UNKNOWN ;
1334- if (wacom -> remote_group [i ].name ) {
1335- sysfs_remove_group (wacom -> remote_dir ,
1336- & wacom -> remote_group [i ]);
1334+ if (remote -> remote_group [i ].name ) {
1335+ sysfs_remove_group (remote -> remote_dir ,
1336+ & remote -> remote_group [i ]);
13371337 devm_kfree (& wacom -> hdev -> dev ,
1338- (char * )wacom -> remote_group [i ].name );
1339- wacom -> remote_group [i ].name = NULL ;
1338+ (char * )remote -> remote_group [i ].name );
1339+ remote -> remote_group [i ].name = NULL ;
13401340 }
13411341 }
13421342 }
@@ -1398,27 +1398,57 @@ static const struct attribute *remote_unpair_attrs[] = {
13981398 NULL
13991399};
14001400
1401- static int wacom_initialize_remote (struct wacom * wacom )
1401+ static void wacom_remotes_destroy (void * data )
1402+ {
1403+ struct wacom * wacom = data ;
1404+ struct wacom_remote * remote = wacom -> remote ;
1405+
1406+ if (!remote )
1407+ return ;
1408+
1409+ kobject_put (remote -> remote_dir );
1410+ kfifo_free (& remote -> remote_fifo );
1411+ wacom -> remote = NULL ;
1412+ }
1413+
1414+ static int wacom_initialize_remotes (struct wacom * wacom )
14021415{
14031416 int error = 0 ;
1404- struct wacom_wac * wacom_wac = & ( wacom -> wacom_wac ) ;
1417+ struct wacom_remote * remote ;
14051418 int i ;
14061419
14071420 if (wacom -> wacom_wac .features .type != REMOTE )
14081421 return 0 ;
14091422
1410- wacom -> remote_group [0 ] = remote0_serial_group ;
1411- wacom -> remote_group [1 ] = remote1_serial_group ;
1412- wacom -> remote_group [2 ] = remote2_serial_group ;
1413- wacom -> remote_group [3 ] = remote3_serial_group ;
1414- wacom -> remote_group [4 ] = remote4_serial_group ;
1423+ remote = devm_kzalloc (& wacom -> hdev -> dev , sizeof (* wacom -> remote ),
1424+ GFP_KERNEL );
1425+ if (!remote )
1426+ return - ENOMEM ;
14151427
1416- wacom -> remote_dir = kobject_create_and_add ("wacom_remote" ,
1417- & wacom -> hdev -> dev .kobj );
1418- if (!wacom -> remote_dir )
1428+ wacom -> remote = remote ;
1429+
1430+ spin_lock_init (& remote -> remote_lock );
1431+
1432+ error = kfifo_alloc (& remote -> remote_fifo ,
1433+ 5 * sizeof (struct wacom_remote_data ),
1434+ GFP_KERNEL );
1435+ if (error ) {
1436+ hid_err (wacom -> hdev , "failed allocating remote_fifo\n" );
14191437 return - ENOMEM ;
1438+ }
14201439
1421- error = sysfs_create_files (wacom -> remote_dir , remote_unpair_attrs );
1440+ remote -> remote_group [0 ] = remote0_serial_group ;
1441+ remote -> remote_group [1 ] = remote1_serial_group ;
1442+ remote -> remote_group [2 ] = remote2_serial_group ;
1443+ remote -> remote_group [3 ] = remote3_serial_group ;
1444+ remote -> remote_group [4 ] = remote4_serial_group ;
1445+
1446+ remote -> remote_dir = kobject_create_and_add ("wacom_remote" ,
1447+ & wacom -> hdev -> dev .kobj );
1448+ if (!remote -> remote_dir )
1449+ return - ENOMEM ;
1450+
1451+ error = sysfs_create_files (remote -> remote_dir , remote_unpair_attrs );
14221452
14231453 if (error ) {
14241454 hid_err (wacom -> hdev ,
@@ -1428,9 +1458,14 @@ static int wacom_initialize_remote(struct wacom *wacom)
14281458
14291459 for (i = 0 ; i < WACOM_MAX_REMOTES ; i ++ ) {
14301460 wacom -> led .groups [i ].select = WACOM_STATUS_UNKNOWN ;
1431- wacom_wac -> serial [i ] = 0 ;
1461+ remote -> serial [i ] = 0 ;
14321462 }
14331463
1464+ error = devm_add_action_or_reset (& wacom -> hdev -> dev ,
1465+ wacom_remotes_destroy , wacom );
1466+ if (error )
1467+ return error ;
1468+
14341469 return 0 ;
14351470}
14361471
@@ -1740,7 +1775,7 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
17401775 if (error )
17411776 goto fail_leds ;
17421777
1743- error = wacom_initialize_remote (wacom );
1778+ error = wacom_initialize_remotes (wacom );
17441779 if (error )
17451780 goto fail_remote ;
17461781 }
@@ -1792,7 +1827,6 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
17921827fail_quirks :
17931828 hid_hw_stop (hdev );
17941829fail_hw_start :
1795- kobject_put (wacom -> remote_dir );
17961830fail_remote :
17971831fail_leds :
17981832fail_register_inputs :
@@ -1893,58 +1927,58 @@ static void wacom_wireless_work(struct work_struct *work)
18931927static void wacom_remote_work (struct work_struct * work )
18941928{
18951929 struct wacom * wacom = container_of (work , struct wacom , remote_work );
1896- struct wacom_wac * wacom_wac = & wacom -> wacom_wac ;
1930+ struct wacom_remote * remote = wacom -> remote ;
18971931 struct wacom_remote_data data ;
18981932 unsigned long flags ;
18991933 unsigned int count ;
19001934 u32 serial ;
19011935 int i , k ;
19021936
1903- spin_lock_irqsave (& wacom -> remote_lock , flags );
1937+ spin_lock_irqsave (& remote -> remote_lock , flags );
19041938
1905- count = kfifo_out (& wacom -> remote_fifo , & data , sizeof (data ));
1939+ count = kfifo_out (& remote -> remote_fifo , & data , sizeof (data ));
19061940
19071941 if (count != sizeof (data )) {
19081942 hid_err (wacom -> hdev ,
19091943 "workitem triggered without status available\n" );
1910- spin_unlock_irqrestore (& wacom -> remote_lock , flags );
1944+ spin_unlock_irqrestore (& remote -> remote_lock , flags );
19111945 return ;
19121946 }
19131947
1914- if (!kfifo_is_empty (& wacom -> remote_fifo ))
1948+ if (!kfifo_is_empty (& remote -> remote_fifo ))
19151949 wacom_schedule_work (& wacom -> wacom_wac , WACOM_WORKER_REMOTE );
19161950
1917- spin_unlock_irqrestore (& wacom -> remote_lock , flags );
1951+ spin_unlock_irqrestore (& remote -> remote_lock , flags );
19181952
19191953 for (i = 0 ; i < WACOM_MAX_REMOTES ; i ++ ) {
19201954 serial = data .remote [i ].serial ;
19211955 if (data .remote [i ].connected ) {
19221956
1923- if (wacom_wac -> serial [i ] == serial )
1957+ if (remote -> serial [i ] == serial )
19241958 continue ;
19251959
1926- if (wacom_wac -> serial [i ]) {
1960+ if (remote -> serial [i ]) {
19271961 wacom_remote_destroy_attr_group (wacom ,
1928- wacom_wac -> serial [i ]);
1962+ remote -> serial [i ]);
19291963 }
19301964
19311965 /* A remote can pair more than once with an EKR,
19321966 * check to make sure this serial isn't already paired.
19331967 */
19341968 for (k = 0 ; k < WACOM_MAX_REMOTES ; k ++ ) {
1935- if (wacom_wac -> serial [k ] == serial )
1969+ if (remote -> serial [k ] == serial )
19361970 break ;
19371971 }
19381972
19391973 if (k < WACOM_MAX_REMOTES ) {
1940- wacom_wac -> serial [i ] = serial ;
1974+ remote -> serial [i ] = serial ;
19411975 continue ;
19421976 }
19431977 wacom_remote_create_attr_group (wacom , serial , i );
19441978
1945- } else if (wacom_wac -> serial [i ]) {
1979+ } else if (remote -> serial [i ]) {
19461980 wacom_remote_destroy_attr_group (wacom ,
1947- wacom_wac -> serial [i ]);
1981+ remote -> serial [i ]);
19481982 }
19491983 }
19501984}
@@ -1992,16 +2026,6 @@ static int wacom_probe(struct hid_device *hdev,
19922026 INIT_WORK (& wacom -> wireless_work , wacom_wireless_work );
19932027 INIT_WORK (& wacom -> battery_work , wacom_battery_work );
19942028 INIT_WORK (& wacom -> remote_work , wacom_remote_work );
1995- spin_lock_init (& wacom -> remote_lock );
1996-
1997- if (kfifo_alloc (& wacom -> remote_fifo ,
1998- 5 * sizeof (struct wacom_remote_data ),
1999- GFP_KERNEL )) {
2000- dev_err (& hdev -> dev ,
2001- "%s:failed allocating remote_fifo\n" , __func__ );
2002- error = - ENOMEM ;
2003- goto fail_type ;
2004- }
20052029
20062030 /* ask for the report descriptor to be loaded by HID */
20072031 error = hid_parse (hdev );
@@ -2025,7 +2049,6 @@ static int wacom_probe(struct hid_device *hdev,
20252049 return 0 ;
20262050
20272051fail_parse :
2028- kfifo_free (& wacom -> remote_fifo );
20292052fail_type :
20302053 hid_set_drvdata (hdev , NULL );
20312054 return error ;
@@ -2045,8 +2068,6 @@ static void wacom_remove(struct hid_device *hdev)
20452068 cancel_work_sync (& wacom -> wireless_work );
20462069 cancel_work_sync (& wacom -> battery_work );
20472070 cancel_work_sync (& wacom -> remote_work );
2048- kfifo_free (& wacom -> remote_fifo );
2049- kobject_put (wacom -> remote_dir );
20502071 if (hdev -> bus == BUS_BLUETOOTH )
20512072 device_remove_file (& hdev -> dev , & dev_attr_speed );
20522073
0 commit comments