.. | .. |
---|
310 | 310 | } |
---|
311 | 311 | static DEVICE_ATTR_WO(enable_compliance); |
---|
312 | 312 | |
---|
313 | | -static struct attribute *lvs_attributes[] = { |
---|
| 313 | +static struct attribute *lvs_attrs[] = { |
---|
314 | 314 | &dev_attr_get_dev_desc.attr, |
---|
315 | 315 | &dev_attr_u1_timeout.attr, |
---|
316 | 316 | &dev_attr_u2_timeout.attr, |
---|
.. | .. |
---|
321 | 321 | &dev_attr_enable_compliance.attr, |
---|
322 | 322 | NULL |
---|
323 | 323 | }; |
---|
324 | | - |
---|
325 | | -static const struct attribute_group lvs_attr_group = { |
---|
326 | | - .attrs = lvs_attributes, |
---|
327 | | -}; |
---|
| 324 | +ATTRIBUTE_GROUPS(lvs); |
---|
328 | 325 | |
---|
329 | 326 | static void lvs_rh_work(struct work_struct *work) |
---|
330 | 327 | { |
---|
.. | .. |
---|
439 | 436 | |
---|
440 | 437 | INIT_WORK(&lvs->rh_work, lvs_rh_work); |
---|
441 | 438 | |
---|
442 | | - ret = sysfs_create_group(&intf->dev.kobj, &lvs_attr_group); |
---|
443 | | - if (ret < 0) { |
---|
444 | | - dev_err(&intf->dev, "Failed to create sysfs node %d\n", ret); |
---|
445 | | - goto free_urb; |
---|
446 | | - } |
---|
447 | | - |
---|
448 | 439 | pipe = usb_rcvintpipe(hdev, endpoint->bEndpointAddress); |
---|
449 | 440 | maxp = usb_maxpacket(hdev, pipe, usb_pipeout(pipe)); |
---|
450 | 441 | usb_fill_int_urb(lvs->urb, hdev, pipe, &lvs->buffer[0], maxp, |
---|
.. | .. |
---|
453 | 444 | ret = usb_submit_urb(lvs->urb, GFP_KERNEL); |
---|
454 | 445 | if (ret < 0) { |
---|
455 | 446 | dev_err(&intf->dev, "couldn't submit lvs urb %d\n", ret); |
---|
456 | | - goto sysfs_remove; |
---|
| 447 | + goto free_urb; |
---|
457 | 448 | } |
---|
458 | 449 | |
---|
459 | 450 | return ret; |
---|
460 | 451 | |
---|
461 | | -sysfs_remove: |
---|
462 | | - sysfs_remove_group(&intf->dev.kobj, &lvs_attr_group); |
---|
463 | 452 | free_urb: |
---|
464 | 453 | usb_free_urb(lvs->urb); |
---|
465 | 454 | return ret; |
---|
.. | .. |
---|
469 | 458 | { |
---|
470 | 459 | struct lvs_rh *lvs = usb_get_intfdata(intf); |
---|
471 | 460 | |
---|
472 | | - sysfs_remove_group(&intf->dev.kobj, &lvs_attr_group); |
---|
473 | 461 | usb_poison_urb(lvs->urb); /* used in scheduled work */ |
---|
474 | 462 | flush_work(&lvs->rh_work); |
---|
475 | 463 | usb_free_urb(lvs->urb); |
---|
.. | .. |
---|
479 | 467 | .name = "lvs", |
---|
480 | 468 | .probe = lvs_rh_probe, |
---|
481 | 469 | .disconnect = lvs_rh_disconnect, |
---|
| 470 | + .dev_groups = lvs_groups, |
---|
482 | 471 | }; |
---|
483 | 472 | |
---|
484 | 473 | module_usb_driver(lvs_driver); |
---|