aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/via/viafbdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/via/viafbdev.c')
-rw-r--r--drivers/video/via/viafbdev.c87
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
1673static int parse_mode(const char *str, u32 *xres, u32 *yres) 1670static 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
1740static 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
1759static 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
1733int __devinit via_fb_pci_probe(struct viafb_dev *vdev) 1766int __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);
1917out_fb_release: 1952out_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