| .. | .. |
|---|
| 69 | 69 | |
|---|
| 70 | 70 | struct delayed_work work; |
|---|
| 71 | 71 | int button_pressed; |
|---|
| 72 | | - spinlock_t lock; |
|---|
| 73 | 72 | struct mutex sysfslock; /* concurrent read and write */ |
|---|
| 74 | 73 | }; |
|---|
| 75 | 74 | |
|---|
| .. | .. |
|---|
| 79 | 78 | { |
|---|
| 80 | 79 | struct appledisplay *pdata = urb->context; |
|---|
| 81 | 80 | struct device *dev = &pdata->udev->dev; |
|---|
| 82 | | - unsigned long flags; |
|---|
| 83 | 81 | int status = urb->status; |
|---|
| 84 | 82 | int retval; |
|---|
| 85 | 83 | |
|---|
| .. | .. |
|---|
| 91 | 89 | dev_err(dev, |
|---|
| 92 | 90 | "OVERFLOW with data length %d, actual length is %d\n", |
|---|
| 93 | 91 | ACD_URB_BUFFER_LEN, pdata->urb->actual_length); |
|---|
| 94 | | - /* fall through */ |
|---|
| 92 | + fallthrough; |
|---|
| 95 | 93 | case -ECONNRESET: |
|---|
| 96 | 94 | case -ENOENT: |
|---|
| 97 | 95 | case -ESHUTDOWN: |
|---|
| .. | .. |
|---|
| 105 | 103 | goto exit; |
|---|
| 106 | 104 | } |
|---|
| 107 | 105 | |
|---|
| 108 | | - spin_lock_irqsave(&pdata->lock, flags); |
|---|
| 109 | | - |
|---|
| 110 | 106 | switch(pdata->urbdata[1]) { |
|---|
| 111 | 107 | case ACD_BTN_BRIGHT_UP: |
|---|
| 112 | 108 | case ACD_BTN_BRIGHT_DOWN: |
|---|
| .. | .. |
|---|
| 118 | 114 | pdata->button_pressed = 0; |
|---|
| 119 | 115 | break; |
|---|
| 120 | 116 | } |
|---|
| 121 | | - |
|---|
| 122 | | - spin_unlock_irqrestore(&pdata->lock, flags); |
|---|
| 123 | 117 | |
|---|
| 124 | 118 | exit: |
|---|
| 125 | 119 | retval = usb_submit_urb(pdata->urb, GFP_ATOMIC); |
|---|
| .. | .. |
|---|
| 234 | 228 | |
|---|
| 235 | 229 | pdata->udev = udev; |
|---|
| 236 | 230 | |
|---|
| 237 | | - spin_lock_init(&pdata->lock); |
|---|
| 238 | 231 | INIT_DELAYED_WORK(&pdata->work, appledisplay_work); |
|---|
| 239 | 232 | mutex_init(&pdata->sysfslock); |
|---|
| 240 | 233 | |
|---|
| .. | .. |
|---|
| 266 | 259 | usb_rcvintpipe(udev, int_in_endpointAddr), |
|---|
| 267 | 260 | pdata->urbdata, ACD_URB_BUFFER_LEN, appledisplay_complete, |
|---|
| 268 | 261 | pdata, 1); |
|---|
| 262 | + pdata->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; |
|---|
| 269 | 263 | if (usb_submit_urb(pdata->urb, GFP_KERNEL)) { |
|---|
| 270 | 264 | retval = -EIO; |
|---|
| 271 | 265 | dev_err(&iface->dev, "Submitting URB failed\n"); |
|---|
| .. | .. |
|---|
| 311 | 305 | if (pdata->urb) { |
|---|
| 312 | 306 | usb_kill_urb(pdata->urb); |
|---|
| 313 | 307 | cancel_delayed_work_sync(&pdata->work); |
|---|
| 314 | | - if (pdata->urbdata) |
|---|
| 315 | | - usb_free_coherent(pdata->udev, ACD_URB_BUFFER_LEN, |
|---|
| 308 | + usb_free_coherent(pdata->udev, ACD_URB_BUFFER_LEN, |
|---|
| 316 | 309 | pdata->urbdata, pdata->urb->transfer_dma); |
|---|
| 317 | 310 | usb_free_urb(pdata->urb); |
|---|
| 318 | 311 | } |
|---|
| .. | .. |
|---|
| 349 | 342 | .disconnect = appledisplay_disconnect, |
|---|
| 350 | 343 | .id_table = appledisplay_table, |
|---|
| 351 | 344 | }; |
|---|
| 352 | | - |
|---|
| 353 | | -static int __init appledisplay_init(void) |
|---|
| 354 | | -{ |
|---|
| 355 | | - return usb_register(&appledisplay_driver); |
|---|
| 356 | | -} |
|---|
| 357 | | - |
|---|
| 358 | | -static void __exit appledisplay_exit(void) |
|---|
| 359 | | -{ |
|---|
| 360 | | - usb_deregister(&appledisplay_driver); |
|---|
| 361 | | -} |
|---|
| 345 | +module_usb_driver(appledisplay_driver); |
|---|
| 362 | 346 | |
|---|
| 363 | 347 | MODULE_AUTHOR("Michael Hanselmann"); |
|---|
| 364 | 348 | MODULE_DESCRIPTION("Apple Cinema Display driver"); |
|---|
| 365 | 349 | MODULE_LICENSE("GPL"); |
|---|
| 366 | | - |
|---|
| 367 | | -module_init(appledisplay_init); |
|---|
| 368 | | -module_exit(appledisplay_exit); |
|---|