diff options
Diffstat (limited to 'drivers/video/uvesafb.c')
-rw-r--r-- | drivers/video/uvesafb.c | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/drivers/video/uvesafb.c b/drivers/video/uvesafb.c index 5180a215d781..7f8472cc993b 100644 --- a/drivers/video/uvesafb.c +++ b/drivers/video/uvesafb.c | |||
@@ -1552,8 +1552,7 @@ static void __devinit uvesafb_init_mtrr(struct fb_info *info) | |||
1552 | int rc; | 1552 | int rc; |
1553 | 1553 | ||
1554 | /* Find the largest power-of-two */ | 1554 | /* Find the largest power-of-two */ |
1555 | while (temp_size & (temp_size - 1)) | 1555 | temp_size = roundup_pow_of_two(temp_size); |
1556 | temp_size &= (temp_size - 1); | ||
1557 | 1556 | ||
1558 | /* Try and find a power of two to add */ | 1557 | /* Try and find a power of two to add */ |
1559 | do { | 1558 | do { |
@@ -1566,6 +1565,28 @@ static void __devinit uvesafb_init_mtrr(struct fb_info *info) | |||
1566 | #endif /* CONFIG_MTRR */ | 1565 | #endif /* CONFIG_MTRR */ |
1567 | } | 1566 | } |
1568 | 1567 | ||
1568 | static void __devinit uvesafb_ioremap(struct fb_info *info) | ||
1569 | { | ||
1570 | #ifdef CONFIG_X86 | ||
1571 | switch (mtrr) { | ||
1572 | case 1: /* uncachable */ | ||
1573 | info->screen_base = ioremap_nocache(info->fix.smem_start, info->fix.smem_len); | ||
1574 | break; | ||
1575 | case 2: /* write-back */ | ||
1576 | info->screen_base = ioremap_cache(info->fix.smem_start, info->fix.smem_len); | ||
1577 | break; | ||
1578 | case 3: /* write-combining */ | ||
1579 | info->screen_base = ioremap_wc(info->fix.smem_start, info->fix.smem_len); | ||
1580 | break; | ||
1581 | case 4: /* write-through */ | ||
1582 | default: | ||
1583 | info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len); | ||
1584 | break; | ||
1585 | } | ||
1586 | #else | ||
1587 | info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len); | ||
1588 | #endif /* CONFIG_X86 */ | ||
1589 | } | ||
1569 | 1590 | ||
1570 | static ssize_t uvesafb_show_vbe_ver(struct device *dev, | 1591 | static ssize_t uvesafb_show_vbe_ver(struct device *dev, |
1571 | struct device_attribute *attr, char *buf) | 1592 | struct device_attribute *attr, char *buf) |
@@ -1736,15 +1757,22 @@ static int __devinit uvesafb_probe(struct platform_device *dev) | |||
1736 | 1757 | ||
1737 | uvesafb_init_info(info, mode); | 1758 | uvesafb_init_info(info, mode); |
1738 | 1759 | ||
1760 | if (!request_region(0x3c0, 32, "uvesafb")) { | ||
1761 | printk(KERN_ERR "uvesafb: request region 0x3c0-0x3e0 failed\n"); | ||
1762 | err = -EIO; | ||
1763 | goto out_mode; | ||
1764 | } | ||
1765 | |||
1739 | if (!request_mem_region(info->fix.smem_start, info->fix.smem_len, | 1766 | if (!request_mem_region(info->fix.smem_start, info->fix.smem_len, |
1740 | "uvesafb")) { | 1767 | "uvesafb")) { |
1741 | printk(KERN_ERR "uvesafb: cannot reserve video memory at " | 1768 | printk(KERN_ERR "uvesafb: cannot reserve video memory at " |
1742 | "0x%lx\n", info->fix.smem_start); | 1769 | "0x%lx\n", info->fix.smem_start); |
1743 | err = -EIO; | 1770 | err = -EIO; |
1744 | goto out_mode; | 1771 | goto out_reg; |
1745 | } | 1772 | } |
1746 | 1773 | ||
1747 | info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len); | 1774 | uvesafb_init_mtrr(info); |
1775 | uvesafb_ioremap(info); | ||
1748 | 1776 | ||
1749 | if (!info->screen_base) { | 1777 | if (!info->screen_base) { |
1750 | printk(KERN_ERR | 1778 | printk(KERN_ERR |
@@ -1755,20 +1783,13 @@ static int __devinit uvesafb_probe(struct platform_device *dev) | |||
1755 | goto out_mem; | 1783 | goto out_mem; |
1756 | } | 1784 | } |
1757 | 1785 | ||
1758 | if (!request_region(0x3c0, 32, "uvesafb")) { | ||
1759 | printk(KERN_ERR "uvesafb: request region 0x3c0-0x3e0 failed\n"); | ||
1760 | err = -EIO; | ||
1761 | goto out_unmap; | ||
1762 | } | ||
1763 | |||
1764 | uvesafb_init_mtrr(info); | ||
1765 | platform_set_drvdata(dev, info); | 1786 | platform_set_drvdata(dev, info); |
1766 | 1787 | ||
1767 | if (register_framebuffer(info) < 0) { | 1788 | if (register_framebuffer(info) < 0) { |
1768 | printk(KERN_ERR | 1789 | printk(KERN_ERR |
1769 | "uvesafb: failed to register framebuffer device\n"); | 1790 | "uvesafb: failed to register framebuffer device\n"); |
1770 | err = -EINVAL; | 1791 | err = -EINVAL; |
1771 | goto out_reg; | 1792 | goto out_unmap; |
1772 | } | 1793 | } |
1773 | 1794 | ||
1774 | printk(KERN_INFO "uvesafb: framebuffer at 0x%lx, mapped to 0x%p, " | 1795 | printk(KERN_INFO "uvesafb: framebuffer at 0x%lx, mapped to 0x%p, " |
@@ -1785,12 +1806,12 @@ static int __devinit uvesafb_probe(struct platform_device *dev) | |||
1785 | 1806 | ||
1786 | return 0; | 1807 | return 0; |
1787 | 1808 | ||
1788 | out_reg: | ||
1789 | release_region(0x3c0, 32); | ||
1790 | out_unmap: | 1809 | out_unmap: |
1791 | iounmap(info->screen_base); | 1810 | iounmap(info->screen_base); |
1792 | out_mem: | 1811 | out_mem: |
1793 | release_mem_region(info->fix.smem_start, info->fix.smem_len); | 1812 | release_mem_region(info->fix.smem_start, info->fix.smem_len); |
1813 | out_reg: | ||
1814 | release_region(0x3c0, 32); | ||
1794 | out_mode: | 1815 | out_mode: |
1795 | if (!list_empty(&info->modelist)) | 1816 | if (!list_empty(&info->modelist)) |
1796 | fb_destroy_modelist(&info->modelist); | 1817 | fb_destroy_modelist(&info->modelist); |