.. | .. |
---|
419 | 419 | schedule(); |
---|
420 | 420 | finish_wait(&arcfb_waitq, &wait); |
---|
421 | 421 | } |
---|
| 422 | + fallthrough; |
---|
| 423 | + |
---|
422 | 424 | case FBIO_GETCONTROL2: |
---|
423 | 425 | { |
---|
424 | 426 | unsigned char ctl2; |
---|
.. | .. |
---|
489 | 491 | return err; |
---|
490 | 492 | } |
---|
491 | 493 | |
---|
492 | | -static struct fb_ops arcfb_ops = { |
---|
| 494 | +static const struct fb_ops arcfb_ops = { |
---|
493 | 495 | .owner = THIS_MODULE, |
---|
494 | 496 | .fb_open = arcfb_open, |
---|
495 | 497 | .fb_read = fb_sys_read, |
---|
.. | .. |
---|
521 | 523 | |
---|
522 | 524 | info = framebuffer_alloc(sizeof(struct arcfb_par), &dev->dev); |
---|
523 | 525 | if (!info) |
---|
524 | | - goto err; |
---|
| 526 | + goto err_fb_alloc; |
---|
525 | 527 | |
---|
526 | 528 | info->screen_base = (char __iomem *)videomemory; |
---|
527 | 529 | info->fbops = &arcfb_ops; |
---|
.. | .. |
---|
533 | 535 | |
---|
534 | 536 | if (!dio_addr || !cio_addr || !c2io_addr) { |
---|
535 | 537 | printk(KERN_WARNING "no IO addresses supplied\n"); |
---|
536 | | - goto err1; |
---|
| 538 | + goto err_addr; |
---|
537 | 539 | } |
---|
538 | 540 | par->dio_addr = dio_addr; |
---|
539 | 541 | par->cio_addr = cio_addr; |
---|
.. | .. |
---|
542 | 544 | par->cslut[1] = 0x06; |
---|
543 | 545 | info->flags = FBINFO_FLAG_DEFAULT; |
---|
544 | 546 | spin_lock_init(&par->lock); |
---|
545 | | - retval = register_framebuffer(info); |
---|
546 | | - if (retval < 0) |
---|
547 | | - goto err1; |
---|
548 | | - platform_set_drvdata(dev, info); |
---|
549 | 547 | if (irq) { |
---|
550 | 548 | par->irq = irq; |
---|
551 | 549 | if (request_irq(par->irq, &arcfb_interrupt, IRQF_SHARED, |
---|
.. | .. |
---|
553 | 551 | printk(KERN_INFO |
---|
554 | 552 | "arcfb: Failed req IRQ %d\n", par->irq); |
---|
555 | 553 | retval = -EBUSY; |
---|
556 | | - goto err1; |
---|
| 554 | + goto err_addr; |
---|
557 | 555 | } |
---|
558 | 556 | } |
---|
| 557 | + retval = register_framebuffer(info); |
---|
| 558 | + if (retval < 0) |
---|
| 559 | + goto err_register_fb; |
---|
| 560 | + platform_set_drvdata(dev, info); |
---|
559 | 561 | fb_info(info, "Arc frame buffer device, using %dK of video memory\n", |
---|
560 | 562 | videomemorysize >> 10); |
---|
561 | 563 | |
---|
.. | .. |
---|
578 | 580 | } |
---|
579 | 581 | |
---|
580 | 582 | return 0; |
---|
581 | | -err1: |
---|
| 583 | + |
---|
| 584 | +err_register_fb: |
---|
| 585 | + free_irq(par->irq, info); |
---|
| 586 | +err_addr: |
---|
582 | 587 | framebuffer_release(info); |
---|
583 | | -err: |
---|
| 588 | +err_fb_alloc: |
---|
584 | 589 | vfree(videomemory); |
---|
585 | 590 | return retval; |
---|
586 | 591 | } |
---|
.. | .. |
---|
591 | 596 | |
---|
592 | 597 | if (info) { |
---|
593 | 598 | unregister_framebuffer(info); |
---|
| 599 | + if (irq) |
---|
| 600 | + free_irq(((struct arcfb_par *)(info->par))->irq, info); |
---|
594 | 601 | vfree((void __force *)info->screen_base); |
---|
595 | 602 | framebuffer_release(info); |
---|
596 | 603 | } |
---|