diff options
| -rw-r--r-- | drivers/video/neofb.c | 95 |
1 files changed, 22 insertions, 73 deletions
diff --git a/drivers/video/neofb.c b/drivers/video/neofb.c index b033e5a4dc86..669b8c196bba 100644 --- a/drivers/video/neofb.c +++ b/drivers/video/neofb.c | |||
| @@ -479,7 +479,8 @@ static inline int neo2200_sync(struct fb_info *info) | |||
| 479 | { | 479 | { |
| 480 | struct neofb_par *par = info->par; | 480 | struct neofb_par *par = info->par; |
| 481 | 481 | ||
| 482 | while (readl(&par->neo2200->bltStat) & 1); | 482 | while (readl(&par->neo2200->bltStat) & 1) |
| 483 | cpu_relax(); | ||
| 483 | return 0; | 484 | return 0; |
| 484 | } | 485 | } |
| 485 | 486 | ||
| @@ -587,34 +588,14 @@ static int | |||
| 587 | neofb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | 588 | neofb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) |
| 588 | { | 589 | { |
| 589 | struct neofb_par *par = info->par; | 590 | struct neofb_par *par = info->par; |
| 590 | unsigned int pixclock = var->pixclock; | ||
| 591 | struct xtimings timings; | ||
| 592 | int memlen, vramlen; | 591 | int memlen, vramlen; |
| 593 | int mode_ok = 0; | 592 | int mode_ok = 0; |
| 594 | 593 | ||
| 595 | DBG("neofb_check_var"); | 594 | DBG("neofb_check_var"); |
| 596 | 595 | ||
| 597 | if (!pixclock) | 596 | if (PICOS2KHZ(var->pixclock) > par->maxClock) |
| 598 | pixclock = 10000; /* 10ns = 100MHz */ | ||
| 599 | timings.pixclock = 1000000000 / pixclock; | ||
| 600 | if (timings.pixclock < 1) | ||
| 601 | timings.pixclock = 1; | ||
| 602 | |||
| 603 | if (timings.pixclock > par->maxClock) | ||
| 604 | return -EINVAL; | 597 | return -EINVAL; |
| 605 | 598 | ||
| 606 | timings.dblscan = var->vmode & FB_VMODE_DOUBLE; | ||
| 607 | timings.interlaced = var->vmode & FB_VMODE_INTERLACED; | ||
| 608 | timings.HDisplay = var->xres; | ||
| 609 | timings.HSyncStart = timings.HDisplay + var->right_margin; | ||
| 610 | timings.HSyncEnd = timings.HSyncStart + var->hsync_len; | ||
| 611 | timings.HTotal = timings.HSyncEnd + var->left_margin; | ||
| 612 | timings.VDisplay = var->yres; | ||
| 613 | timings.VSyncStart = timings.VDisplay + var->lower_margin; | ||
| 614 | timings.VSyncEnd = timings.VSyncStart + var->vsync_len; | ||
| 615 | timings.VTotal = timings.VSyncEnd + var->upper_margin; | ||
| 616 | timings.sync = var->sync; | ||
| 617 | |||
| 618 | /* Is the mode larger than the LCD panel? */ | 599 | /* Is the mode larger than the LCD panel? */ |
| 619 | if (par->internal_display && | 600 | if (par->internal_display && |
| 620 | ((var->xres > par->NeoPanelWidth) || | 601 | ((var->xres > par->NeoPanelWidth) || |
| @@ -1923,9 +1904,6 @@ static int __devinit neo_init_hw(struct fb_info *info) | |||
| 1923 | int maxClock = 65000; | 1904 | int maxClock = 65000; |
| 1924 | int CursorMem = 1024; | 1905 | int CursorMem = 1024; |
| 1925 | int CursorOff = 0x100; | 1906 | int CursorOff = 0x100; |
| 1926 | int linearSize = 1024; | ||
| 1927 | int maxWidth = 1024; | ||
| 1928 | int maxHeight = 1024; | ||
| 1929 | 1907 | ||
| 1930 | DBG("neo_init_hw"); | 1908 | DBG("neo_init_hw"); |
| 1931 | 1909 | ||
| @@ -1944,81 +1922,52 @@ static int __devinit neo_init_hw(struct fb_info *info) | |||
| 1944 | case FB_ACCEL_NEOMAGIC_NM2070: | 1922 | case FB_ACCEL_NEOMAGIC_NM2070: |
| 1945 | videoRam = 896; | 1923 | videoRam = 896; |
| 1946 | maxClock = 65000; | 1924 | maxClock = 65000; |
| 1947 | CursorMem = 2048; | ||
| 1948 | CursorOff = 0x100; | ||
| 1949 | linearSize = 1024; | ||
| 1950 | maxWidth = 1024; | ||
| 1951 | maxHeight = 1024; | ||
| 1952 | break; | 1925 | break; |
| 1953 | case FB_ACCEL_NEOMAGIC_NM2090: | 1926 | case FB_ACCEL_NEOMAGIC_NM2090: |
| 1954 | case FB_ACCEL_NEOMAGIC_NM2093: | 1927 | case FB_ACCEL_NEOMAGIC_NM2093: |
| 1955 | videoRam = 1152; | ||
| 1956 | maxClock = 80000; | ||
| 1957 | CursorMem = 2048; | ||
| 1958 | CursorOff = 0x100; | ||
| 1959 | linearSize = 2048; | ||
| 1960 | maxWidth = 1024; | ||
| 1961 | maxHeight = 1024; | ||
| 1962 | break; | ||
| 1963 | case FB_ACCEL_NEOMAGIC_NM2097: | 1928 | case FB_ACCEL_NEOMAGIC_NM2097: |
| 1964 | videoRam = 1152; | 1929 | videoRam = 1152; |
| 1965 | maxClock = 80000; | 1930 | maxClock = 80000; |
| 1966 | CursorMem = 1024; | ||
| 1967 | CursorOff = 0x100; | ||
| 1968 | linearSize = 2048; | ||
| 1969 | maxWidth = 1024; | ||
| 1970 | maxHeight = 1024; | ||
| 1971 | break; | 1931 | break; |
| 1972 | case FB_ACCEL_NEOMAGIC_NM2160: | 1932 | case FB_ACCEL_NEOMAGIC_NM2160: |
| 1973 | videoRam = 2048; | 1933 | videoRam = 2048; |
| 1974 | maxClock = 90000; | 1934 | maxClock = 90000; |
| 1975 | CursorMem = 1024; | ||
| 1976 | CursorOff = 0x100; | ||
| 1977 | linearSize = 2048; | ||
| 1978 | maxWidth = 1024; | ||
| 1979 | maxHeight = 1024; | ||
| 1980 | break; | 1935 | break; |
| 1981 | case FB_ACCEL_NEOMAGIC_NM2200: | 1936 | case FB_ACCEL_NEOMAGIC_NM2200: |
| 1982 | videoRam = 2560; | 1937 | videoRam = 2560; |
| 1983 | maxClock = 110000; | 1938 | maxClock = 110000; |
| 1984 | CursorMem = 1024; | ||
| 1985 | CursorOff = 0x1000; | ||
| 1986 | linearSize = 4096; | ||
| 1987 | maxWidth = 1280; | ||
| 1988 | maxHeight = 1024; /* ???? */ | ||
| 1989 | |||
| 1990 | par->neo2200 = (Neo2200 __iomem *) par->mmio_vbase; | ||
| 1991 | break; | 1939 | break; |
| 1992 | case FB_ACCEL_NEOMAGIC_NM2230: | 1940 | case FB_ACCEL_NEOMAGIC_NM2230: |
| 1993 | videoRam = 3008; | 1941 | videoRam = 3008; |
| 1994 | maxClock = 110000; | 1942 | maxClock = 110000; |
| 1995 | CursorMem = 1024; | ||
| 1996 | CursorOff = 0x1000; | ||
| 1997 | linearSize = 4096; | ||
| 1998 | maxWidth = 1280; | ||
| 1999 | maxHeight = 1024; /* ???? */ | ||
| 2000 | |||
| 2001 | par->neo2200 = (Neo2200 __iomem *) par->mmio_vbase; | ||
| 2002 | break; | 1943 | break; |
| 2003 | case FB_ACCEL_NEOMAGIC_NM2360: | 1944 | case FB_ACCEL_NEOMAGIC_NM2360: |
| 2004 | videoRam = 4096; | 1945 | videoRam = 4096; |
| 2005 | maxClock = 110000; | 1946 | maxClock = 110000; |
| 2006 | CursorMem = 1024; | ||
| 2007 | CursorOff = 0x1000; | ||
| 2008 | linearSize = 4096; | ||
| 2009 | maxWidth = 1280; | ||
| 2010 | maxHeight = 1024; /* ???? */ | ||
| 2011 | |||
| 2012 | par->neo2200 = (Neo2200 __iomem *) par->mmio_vbase; | ||
| 2013 | break; | 1947 | break; |
| 2014 | case FB_ACCEL_NEOMAGIC_NM2380: | 1948 | case FB_ACCEL_NEOMAGIC_NM2380: |
| 2015 | videoRam = 6144; | 1949 | videoRam = 6144; |
| 2016 | maxClock = 110000; | 1950 | maxClock = 110000; |
| 1951 | break; | ||
| 1952 | } | ||
| 1953 | switch (info->fix.accel) { | ||
| 1954 | case FB_ACCEL_NEOMAGIC_NM2070: | ||
| 1955 | case FB_ACCEL_NEOMAGIC_NM2090: | ||
| 1956 | case FB_ACCEL_NEOMAGIC_NM2093: | ||
| 1957 | CursorMem = 2048; | ||
| 1958 | CursorOff = 0x100; | ||
| 1959 | break; | ||
| 1960 | case FB_ACCEL_NEOMAGIC_NM2097: | ||
| 1961 | case FB_ACCEL_NEOMAGIC_NM2160: | ||
| 1962 | CursorMem = 1024; | ||
| 1963 | CursorOff = 0x100; | ||
| 1964 | break; | ||
| 1965 | case FB_ACCEL_NEOMAGIC_NM2200: | ||
| 1966 | case FB_ACCEL_NEOMAGIC_NM2230: | ||
| 1967 | case FB_ACCEL_NEOMAGIC_NM2360: | ||
| 1968 | case FB_ACCEL_NEOMAGIC_NM2380: | ||
| 2017 | CursorMem = 1024; | 1969 | CursorMem = 1024; |
| 2018 | CursorOff = 0x1000; | 1970 | CursorOff = 0x1000; |
| 2019 | linearSize = 8192; | ||
| 2020 | maxWidth = 1280; | ||
| 2021 | maxHeight = 1024; /* ???? */ | ||
| 2022 | 1971 | ||
| 2023 | par->neo2200 = (Neo2200 __iomem *) par->mmio_vbase; | 1972 | par->neo2200 = (Neo2200 __iomem *) par->mmio_vbase; |
| 2024 | break; | 1973 | break; |
| @@ -2032,7 +1981,7 @@ static int __devinit neo_init_hw(struct fb_info *info) | |||
| 2032 | */ | 1981 | */ |
| 2033 | par->maxClock = maxClock; | 1982 | par->maxClock = maxClock; |
| 2034 | par->cursorOff = CursorOff; | 1983 | par->cursorOff = CursorOff; |
| 2035 | return ((videoRam * 1024)); | 1984 | return videoRam * 1024; |
| 2036 | } | 1985 | } |
| 2037 | 1986 | ||
| 2038 | 1987 | ||
