diff options
Diffstat (limited to 'drivers/video/savage/savagefb_driver.c')
-rw-r--r-- | drivers/video/savage/savagefb_driver.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/drivers/video/savage/savagefb_driver.c b/drivers/video/savage/savagefb_driver.c index 0166ec2ccf32..3d7507ad55f6 100644 --- a/drivers/video/savage/savagefb_driver.c +++ b/drivers/video/savage/savagefb_driver.c | |||
@@ -1623,8 +1623,46 @@ static void savagefb_restore_state(struct fb_info *info) | |||
1623 | savagefb_blank(FB_BLANK_UNBLANK, info); | 1623 | savagefb_blank(FB_BLANK_UNBLANK, info); |
1624 | } | 1624 | } |
1625 | 1625 | ||
1626 | static int savagefb_open(struct fb_info *info, int user) | ||
1627 | { | ||
1628 | struct savagefb_par *par = info->par; | ||
1629 | |||
1630 | mutex_lock(&par->open_lock); | ||
1631 | |||
1632 | if (!par->open_count) { | ||
1633 | memset(&par->vgastate, 0, sizeof(par->vgastate)); | ||
1634 | par->vgastate.flags = VGA_SAVE_CMAP | VGA_SAVE_FONTS | | ||
1635 | VGA_SAVE_MODE; | ||
1636 | par->vgastate.vgabase = par->mmio.vbase + 0x8000; | ||
1637 | save_vga(&par->vgastate); | ||
1638 | savage_get_default_par(par, &par->initial); | ||
1639 | } | ||
1640 | |||
1641 | par->open_count++; | ||
1642 | mutex_unlock(&par->open_lock); | ||
1643 | return 0; | ||
1644 | } | ||
1645 | |||
1646 | static int savagefb_release(struct fb_info *info, int user) | ||
1647 | { | ||
1648 | struct savagefb_par *par = info->par; | ||
1649 | |||
1650 | mutex_lock(&par->open_lock); | ||
1651 | |||
1652 | if (par->open_count == 1) { | ||
1653 | savage_set_default_par(par, &par->initial); | ||
1654 | restore_vga(&par->vgastate); | ||
1655 | } | ||
1656 | |||
1657 | par->open_count--; | ||
1658 | mutex_unlock(&par->open_lock); | ||
1659 | return 0; | ||
1660 | } | ||
1661 | |||
1626 | static struct fb_ops savagefb_ops = { | 1662 | static struct fb_ops savagefb_ops = { |
1627 | .owner = THIS_MODULE, | 1663 | .owner = THIS_MODULE, |
1664 | .fb_open = savagefb_open, | ||
1665 | .fb_release = savagefb_release, | ||
1628 | .fb_check_var = savagefb_check_var, | 1666 | .fb_check_var = savagefb_check_var, |
1629 | .fb_set_par = savagefb_set_par, | 1667 | .fb_set_par = savagefb_set_par, |
1630 | .fb_setcolreg = savagefb_setcolreg, | 1668 | .fb_setcolreg = savagefb_setcolreg, |
@@ -2173,6 +2211,7 @@ static int __devinit savagefb_probe(struct pci_dev* dev, | |||
2173 | if (!info) | 2211 | if (!info) |
2174 | return -ENOMEM; | 2212 | return -ENOMEM; |
2175 | par = info->par; | 2213 | par = info->par; |
2214 | mutex_init(&par->open_lock); | ||
2176 | err = pci_enable_device(dev); | 2215 | err = pci_enable_device(dev); |
2177 | if (err) | 2216 | if (err) |
2178 | goto failed_enable; | 2217 | goto failed_enable; |