| .. | .. |
|---|
| 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 | } |
|---|