| .. | .. |
|---|
| 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); |
|---|