diff options
Diffstat (limited to 'drivers/video/via/viafbdev.c')
-rw-r--r-- | drivers/video/via/viafbdev.c | 87 |
1 files changed, 62 insertions, 25 deletions
diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c index a13c258bd32f..0c8837565bc7 100644 --- a/drivers/video/via/viafbdev.c +++ b/drivers/video/via/viafbdev.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
25 | #include <linux/stat.h> | 25 | #include <linux/stat.h> |
26 | #include <linux/via-core.h> | 26 | #include <linux/via-core.h> |
27 | #include <linux/via_i2c.h> | ||
27 | #include <asm/olpc.h> | 28 | #include <asm/olpc.h> |
28 | 29 | ||
29 | #define _MASTER_FILE | 30 | #define _MASTER_FILE |
@@ -286,26 +287,22 @@ static int viafb_set_par(struct fb_info *info) | |||
286 | viafb_second_yres, viafb_bpp1, 1); | 287 | viafb_second_yres, viafb_bpp1, 1); |
287 | } | 288 | } |
288 | 289 | ||
289 | refresh = viafb_get_refresh(info->var.xres, info->var.yres, | 290 | refresh = get_var_refresh(&info->var); |
290 | get_var_refresh(&info->var)); | 291 | if (viafb_dual_fb && viapar->iga_path == IGA2) { |
291 | if (viafb_get_best_mode(viafbinfo->var.xres, viafbinfo->var.yres, | 292 | viafb_bpp1 = info->var.bits_per_pixel; |
292 | refresh)) { | 293 | viafb_refresh1 = refresh; |
293 | if (viafb_dual_fb && viapar->iga_path == IGA2) { | 294 | } else { |
294 | viafb_bpp1 = info->var.bits_per_pixel; | 295 | viafb_bpp = info->var.bits_per_pixel; |
295 | viafb_refresh1 = refresh; | 296 | viafb_refresh = refresh; |
296 | } else { | ||
297 | viafb_bpp = info->var.bits_per_pixel; | ||
298 | viafb_refresh = refresh; | ||
299 | } | ||
300 | |||
301 | if (info->var.accel_flags & FB_ACCELF_TEXT) | ||
302 | info->flags &= ~FBINFO_HWACCEL_DISABLED; | ||
303 | else | ||
304 | info->flags |= FBINFO_HWACCEL_DISABLED; | ||
305 | viafb_setmode(info->var.bits_per_pixel, viafb_bpp1); | ||
306 | viafb_pan_display(&info->var, info); | ||
307 | } | 297 | } |
308 | 298 | ||
299 | if (info->var.accel_flags & FB_ACCELF_TEXT) | ||
300 | info->flags &= ~FBINFO_HWACCEL_DISABLED; | ||
301 | else | ||
302 | info->flags |= FBINFO_HWACCEL_DISABLED; | ||
303 | viafb_setmode(); | ||
304 | viafb_pan_display(&info->var, info); | ||
305 | |||
309 | return 0; | 306 | return 0; |
310 | } | 307 | } |
311 | 308 | ||
@@ -1670,12 +1667,23 @@ static void viafb_remove_proc(struct viafb_shared *shared) | |||
1670 | } | 1667 | } |
1671 | #undef IS_VT1636 | 1668 | #undef IS_VT1636 |
1672 | 1669 | ||
1673 | static int parse_mode(const char *str, u32 *xres, u32 *yres) | 1670 | static int parse_mode(const char *str, u32 devices, u32 *xres, u32 *yres) |
1674 | { | 1671 | { |
1672 | const struct fb_videomode *mode = NULL; | ||
1675 | char *ptr; | 1673 | char *ptr; |
1676 | 1674 | ||
1677 | if (!str) { | 1675 | if (!str) { |
1678 | if (machine_is_olpc()) { | 1676 | if (devices == VIA_CRT) |
1677 | mode = via_aux_get_preferred_mode( | ||
1678 | viaparinfo->shared->i2c_26); | ||
1679 | else if (devices == VIA_DVP1) | ||
1680 | mode = via_aux_get_preferred_mode( | ||
1681 | viaparinfo->shared->i2c_31); | ||
1682 | |||
1683 | if (mode) { | ||
1684 | *xres = mode->xres; | ||
1685 | *yres = mode->yres; | ||
1686 | } else if (machine_is_olpc()) { | ||
1679 | *xres = 1200; | 1687 | *xres = 1200; |
1680 | *yres = 900; | 1688 | *yres = 900; |
1681 | } else { | 1689 | } else { |
@@ -1729,6 +1737,31 @@ static struct viafb_pm_hooks viafb_fb_pm_hooks = { | |||
1729 | 1737 | ||
1730 | #endif | 1738 | #endif |
1731 | 1739 | ||
1740 | static void __devinit i2c_bus_probe(struct viafb_shared *shared) | ||
1741 | { | ||
1742 | /* should be always CRT */ | ||
1743 | printk(KERN_INFO "viafb: Probing I2C bus 0x26\n"); | ||
1744 | shared->i2c_26 = via_aux_probe(viafb_find_i2c_adapter(VIA_PORT_26)); | ||
1745 | |||
1746 | /* seems to be usually DVP1 */ | ||
1747 | printk(KERN_INFO "viafb: Probing I2C bus 0x31\n"); | ||
1748 | shared->i2c_31 = via_aux_probe(viafb_find_i2c_adapter(VIA_PORT_31)); | ||
1749 | |||
1750 | /* FIXME: what is this? */ | ||
1751 | if (!machine_is_olpc()) { | ||
1752 | printk(KERN_INFO "viafb: Probing I2C bus 0x2C\n"); | ||
1753 | shared->i2c_2C = via_aux_probe(viafb_find_i2c_adapter(VIA_PORT_2C)); | ||
1754 | } | ||
1755 | |||
1756 | printk(KERN_INFO "viafb: Finished I2C bus probing"); | ||
1757 | } | ||
1758 | |||
1759 | static void i2c_bus_free(struct viafb_shared *shared) | ||
1760 | { | ||
1761 | via_aux_free(shared->i2c_26); | ||
1762 | via_aux_free(shared->i2c_31); | ||
1763 | via_aux_free(shared->i2c_2C); | ||
1764 | } | ||
1732 | 1765 | ||
1733 | int __devinit via_fb_pci_probe(struct viafb_dev *vdev) | 1766 | int __devinit via_fb_pci_probe(struct viafb_dev *vdev) |
1734 | { | 1767 | { |
@@ -1762,6 +1795,7 @@ int __devinit via_fb_pci_probe(struct viafb_dev *vdev) | |||
1762 | &viaparinfo->shared->lvds_setting_info2; | 1795 | &viaparinfo->shared->lvds_setting_info2; |
1763 | viaparinfo->chip_info = &viaparinfo->shared->chip_info; | 1796 | viaparinfo->chip_info = &viaparinfo->shared->chip_info; |
1764 | 1797 | ||
1798 | i2c_bus_probe(viaparinfo->shared); | ||
1765 | if (viafb_dual_fb) | 1799 | if (viafb_dual_fb) |
1766 | viafb_SAMM_ON = 1; | 1800 | viafb_SAMM_ON = 1; |
1767 | parse_lcd_port(); | 1801 | parse_lcd_port(); |
@@ -1804,10 +1838,11 @@ int __devinit via_fb_pci_probe(struct viafb_dev *vdev) | |||
1804 | viafb_second_size * 1024 * 1024; | 1838 | viafb_second_size * 1024 * 1024; |
1805 | } | 1839 | } |
1806 | 1840 | ||
1807 | parse_mode(viafb_mode, &default_xres, &default_yres); | 1841 | parse_mode(viafb_mode, viaparinfo->shared->iga1_devices, |
1842 | &default_xres, &default_yres); | ||
1808 | if (viafb_SAMM_ON == 1) | 1843 | if (viafb_SAMM_ON == 1) |
1809 | parse_mode(viafb_mode1, &viafb_second_xres, | 1844 | parse_mode(viafb_mode1, viaparinfo->shared->iga2_devices, |
1810 | &viafb_second_yres); | 1845 | &viafb_second_xres, &viafb_second_yres); |
1811 | 1846 | ||
1812 | default_var.xres = default_xres; | 1847 | default_var.xres = default_xres; |
1813 | default_var.yres = default_yres; | 1848 | default_var.yres = default_yres; |
@@ -1915,6 +1950,7 @@ out_fb1_release: | |||
1915 | if (viafbinfo1) | 1950 | if (viafbinfo1) |
1916 | framebuffer_release(viafbinfo1); | 1951 | framebuffer_release(viafbinfo1); |
1917 | out_fb_release: | 1952 | out_fb_release: |
1953 | i2c_bus_free(viaparinfo->shared); | ||
1918 | framebuffer_release(viafbinfo); | 1954 | framebuffer_release(viafbinfo); |
1919 | return rc; | 1955 | return rc; |
1920 | } | 1956 | } |
@@ -1927,6 +1963,7 @@ void __devexit via_fb_pci_remove(struct pci_dev *pdev) | |||
1927 | if (viafb_dual_fb) | 1963 | if (viafb_dual_fb) |
1928 | unregister_framebuffer(viafbinfo1); | 1964 | unregister_framebuffer(viafbinfo1); |
1929 | viafb_remove_proc(viaparinfo->shared); | 1965 | viafb_remove_proc(viaparinfo->shared); |
1966 | i2c_bus_free(viaparinfo->shared); | ||
1930 | framebuffer_release(viafbinfo); | 1967 | framebuffer_release(viafbinfo); |
1931 | if (viafb_dual_fb) | 1968 | if (viafb_dual_fb) |
1932 | framebuffer_release(viafbinfo1); | 1969 | framebuffer_release(viafbinfo1); |
@@ -2033,9 +2070,9 @@ int __init viafb_init(void) | |||
2033 | if (r < 0) | 2070 | if (r < 0) |
2034 | return r; | 2071 | return r; |
2035 | #endif | 2072 | #endif |
2036 | if (parse_mode(viafb_mode, &dummy_x, &dummy_y) | 2073 | if (parse_mode(viafb_mode, 0, &dummy_x, &dummy_y) |
2037 | || !viafb_get_best_mode(dummy_x, dummy_y, viafb_refresh) | 2074 | || !viafb_get_best_mode(dummy_x, dummy_y, viafb_refresh) |
2038 | || parse_mode(viafb_mode1, &dummy_x, &dummy_y) | 2075 | || parse_mode(viafb_mode1, 0, &dummy_x, &dummy_y) |
2039 | || !viafb_get_best_mode(dummy_x, dummy_y, viafb_refresh1) | 2076 | || !viafb_get_best_mode(dummy_x, dummy_y, viafb_refresh1) |
2040 | || viafb_bpp < 0 || viafb_bpp > 32 | 2077 | || viafb_bpp < 0 || viafb_bpp > 32 |
2041 | || viafb_bpp1 < 0 || viafb_bpp1 > 32 | 2078 | || viafb_bpp1 < 0 || viafb_bpp1 > 32 |