~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to drivers/video/via/viafbdev.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
#include <linux/slab.h>
25
25
#include <linux/stat.h>
26
26
#include <linux/via-core.h>
 
27
#include <asm/olpc.h>
27
28
 
28
29
#define _MASTER_FILE
29
30
#include "global.h"
37
38
static int viafb_bpp = 32;
38
39
static int viafb_bpp1 = 32;
39
40
 
 
41
static unsigned int viafb_second_xres = 640;
 
42
static unsigned int viafb_second_yres = 480;
40
43
static unsigned int viafb_second_offset;
41
44
static int viafb_second_size;
42
45
 
43
46
static int viafb_accel = 1;
44
47
 
45
48
/* Added for specifying active devices.*/
46
 
char *viafb_active_dev;
 
49
static char *viafb_active_dev;
47
50
 
48
51
/*Added for specify lcd output port*/
49
 
char *viafb_lcd_port = "";
50
 
char *viafb_dvi_port = "";
 
52
static char *viafb_lcd_port = "";
 
53
static char *viafb_dvi_port = "";
51
54
 
52
55
static void retrieve_device_setting(struct viafb_ioctl_setting
53
56
        *setting_info);
182
185
        return 0;
183
186
}
184
187
 
 
188
static inline int get_var_refresh(struct fb_var_screeninfo *var)
 
189
{
 
190
        u32 htotal, vtotal;
 
191
 
 
192
        htotal = var->left_margin + var->xres + var->right_margin
 
193
                + var->hsync_len;
 
194
        vtotal = var->upper_margin + var->yres + var->lower_margin
 
195
                + var->vsync_len;
 
196
        return PICOS2KHZ(var->pixclock) * 1000 / (htotal * vtotal);
 
197
}
 
198
 
185
199
static int viafb_check_var(struct fb_var_screeninfo *var,
186
200
        struct fb_info *info)
187
201
{
188
 
        int htotal, vtotal, depth;
 
202
        int depth, refresh;
189
203
        struct VideoModeTable *vmode_entry;
190
204
        struct viafb_par *ppar = info->par;
191
 
        u32 long_refresh, line;
 
205
        u32 line;
192
206
 
193
207
        DEBUG_MSG(KERN_INFO "viafb_check_var!\n");
194
208
        /* Sanity check */
231
245
        /* Based on var passed in to calculate the refresh,
232
246
         * because our driver use some modes special.
233
247
         */
234
 
        htotal = var->xres + var->left_margin +
235
 
        var->right_margin + var->hsync_len;
236
 
        vtotal = var->yres + var->upper_margin +
237
 
                var->lower_margin + var->vsync_len;
238
 
        long_refresh = 1000000000UL / var->pixclock * 1000;
239
 
        long_refresh /= (htotal * vtotal);
240
 
 
241
 
        viafb_refresh = viafb_get_refresh(var->xres, var->yres, long_refresh);
 
248
        refresh = viafb_get_refresh(var->xres, var->yres,
 
249
                get_var_refresh(var));
242
250
 
243
251
        /* Adjust var according to our driver's own table */
244
 
        viafb_fill_var_timing_info(var, viafb_refresh, vmode_entry);
 
252
        viafb_fill_var_timing_info(var, refresh, vmode_entry);
245
253
        if (var->accel_flags & FB_ACCELF_TEXT &&
246
254
                !ppar->shared->vdev->engine_mmio)
247
255
                var->accel_flags = 0;
253
261
{
254
262
        struct viafb_par *viapar = info->par;
255
263
        struct VideoModeTable *vmode_entry, *vmode_entry1 = NULL;
 
264
        int refresh;
256
265
        DEBUG_MSG(KERN_INFO "viafb_set_par!\n");
257
266
 
258
267
        viafb_update_fix(info);
259
268
        viapar->depth = fb_get_color_depth(&info->var, &info->fix);
260
269
        viafb_update_device_setting(viafbinfo->var.xres, viafbinfo->var.yres,
261
 
                viafbinfo->var.bits_per_pixel, viafb_refresh, 0);
 
270
                viafbinfo->var.bits_per_pixel, 0);
262
271
 
263
272
        vmode_entry = viafb_get_mode(viafbinfo->var.xres, viafbinfo->var.yres);
264
273
        if (viafb_dual_fb) {
266
275
                        viafbinfo1->var.yres);
267
276
                viafb_update_device_setting(viafbinfo1->var.xres,
268
277
                        viafbinfo1->var.yres, viafbinfo1->var.bits_per_pixel,
269
 
                        viafb_refresh1, 1);
 
278
                        1);
270
279
        } else if (viafb_SAMM_ON == 1) {
271
280
                DEBUG_MSG(KERN_INFO
272
281
                "viafb_second_xres = %d, viafb_second_yres = %d, bpp = %d\n",
275
284
                        viafb_second_yres);
276
285
 
277
286
                viafb_update_device_setting(viafb_second_xres,
278
 
                        viafb_second_yres, viafb_bpp1, viafb_refresh1, 1);
 
287
                        viafb_second_yres, viafb_bpp1, 1);
279
288
        }
280
289
 
 
290
        refresh = viafb_get_refresh(info->var.xres, info->var.yres,
 
291
                get_var_refresh(&info->var));
281
292
        if (vmode_entry) {
282
 
                if (viafb_dual_fb && viapar->iga_path == IGA2)
 
293
                if (viafb_dual_fb && viapar->iga_path == IGA2) {
283
294
                        viafb_bpp1 = info->var.bits_per_pixel;
284
 
                else
 
295
                        viafb_refresh1 = refresh;
 
296
                } else {
285
297
                        viafb_bpp = info->var.bits_per_pixel;
 
298
                        viafb_refresh = refresh;
 
299
                }
286
300
 
287
301
                if (info->var.accel_flags & FB_ACCELF_TEXT)
288
302
                        info->flags &= ~FBINFO_HWACCEL_DISABLED;
429
443
                if (viafb_SAMM_ON == 1) {
430
444
                        u.viamode.xres_sec = viafb_second_xres;
431
445
                        u.viamode.yres_sec = viafb_second_yres;
432
 
                        u.viamode.virtual_xres_sec = viafb_second_virtual_xres;
433
 
                        u.viamode.virtual_yres_sec = viafb_second_virtual_yres;
 
446
                        u.viamode.virtual_xres_sec = viafb_dual_fb ? viafbinfo1->var.xres_virtual : viafbinfo->var.xres_virtual;
 
447
                        u.viamode.virtual_yres_sec = viafb_dual_fb ? viafbinfo1->var.yres_virtual : viafbinfo->var.yres_virtual;
434
448
                        u.viamode.refresh_sec = viafb_refresh1;
435
449
                        u.viamode.bpp_sec = viafb_bpp1;
436
450
                } else {
919
933
        /* Rule: device on iga1 path are the primary device. */
920
934
        if (viafb_SAMM_ON) {
921
935
                if (viafb_CRT_ON) {
922
 
                        if (viaparinfo->crt_setting_info->iga_path == IGA1) {
923
 
                                DEBUG_MSG(KERN_INFO "CRT IGA Path:%d\n",
924
 
                                        viaparinfo->
925
 
                                        crt_setting_info->iga_path);
 
936
                        if (viaparinfo->shared->iga1_devices & VIA_CRT) {
 
937
                                DEBUG_MSG(KERN_INFO "CRT IGA Path:%d\n", IGA1);
926
938
                                primary_device = CRT_Device;
927
939
                        }
928
940
                }
1000
1012
        /*    Note: The previous of active_dev is primary device,
1001
1013
           and the following is secondary device. */
1002
1014
        if (!viafb_active_dev) {
1003
 
                viafb_CRT_ON = STATE_ON;
1004
 
                viafb_SAMM_ON = STATE_OFF;
 
1015
                if (machine_is_olpc()) { /* LCD only */
 
1016
                        viafb_LCD_ON = STATE_ON;
 
1017
                        viafb_SAMM_ON = STATE_OFF;
 
1018
                } else {
 
1019
                        viafb_CRT_ON = STATE_ON;
 
1020
                        viafb_SAMM_ON = STATE_OFF;
 
1021
                }
1005
1022
        } else if (!strcmp(viafb_active_dev, "CRT+DVI")) {
1006
1023
                /* CRT+DVI */
1007
1024
                viafb_CRT_ON = STATE_ON;
1654
1671
        char *ptr;
1655
1672
 
1656
1673
        if (!str) {
1657
 
                *xres = 640;
1658
 
                *yres = 480;
 
1674
                if (machine_is_olpc()) {
 
1675
                        *xres = 1200;
 
1676
                        *yres = 900;
 
1677
                } else {
 
1678
                        *xres = 640;
 
1679
                        *yres = 480;
 
1680
                }
1659
1681
                return 0;
1660
1682
        }
1661
1683
 
1735
1757
        viaparinfo->lvds_setting_info = &viaparinfo->shared->lvds_setting_info;
1736
1758
        viaparinfo->lvds_setting_info2 =
1737
1759
                &viaparinfo->shared->lvds_setting_info2;
1738
 
        viaparinfo->crt_setting_info = &viaparinfo->shared->crt_setting_info;
1739
1760
        viaparinfo->chip_info = &viaparinfo->shared->chip_info;
1740
1761
 
1741
1762
        if (viafb_dual_fb)
1782
1803
 
1783
1804
        parse_mode(viafb_mode, &default_xres, &default_yres);
1784
1805
        vmode_entry = viafb_get_mode(default_xres, default_yres);
1785
 
        if (viafb_SAMM_ON == 1) {
 
1806
        if (viafb_SAMM_ON == 1)
1786
1807
                parse_mode(viafb_mode1, &viafb_second_xres,
1787
1808
                        &viafb_second_yres);
1788
1809
 
1789
 
                viafb_second_virtual_xres = viafb_second_xres;
1790
 
                viafb_second_virtual_yres = viafb_second_yres;
1791
 
        }
1792
 
 
1793
1810
        default_var.xres = default_xres;
1794
1811
        default_var.yres = default_yres;
1795
1812
        default_var.xres_virtual = default_xres;
1796
1813
        default_var.yres_virtual = default_yres;
1797
1814
        default_var.bits_per_pixel = viafb_bpp;
1798
 
        default_var.pixclock =
1799
 
            viafb_get_pixclock(default_xres, default_yres, viafb_refresh);
1800
 
        default_var.left_margin = (default_xres >> 3) & 0xf8;
1801
 
        default_var.right_margin = 32;
1802
 
        default_var.upper_margin = 16;
1803
 
        default_var.lower_margin = 4;
1804
 
        default_var.hsync_len = default_var.left_margin;
1805
 
        default_var.vsync_len = 4;
 
1815
        viafb_fill_var_timing_info(&default_var, viafb_get_refresh(
 
1816
                default_var.xres, default_var.yres, viafb_refresh),
 
1817
                viafb_get_mode(default_var.xres, default_var.yres));
1806
1818
        viafb_setup_fixinfo(&viafbinfo->fix, viaparinfo);
1807
1819
        viafbinfo->var = default_var;
1808
1820
 
1838
1850
 
1839
1851
                default_var.xres = viafb_second_xres;
1840
1852
                default_var.yres = viafb_second_yres;
1841
 
                default_var.xres_virtual = viafb_second_virtual_xres;
1842
 
                default_var.yres_virtual = viafb_second_virtual_yres;
 
1853
                default_var.xres_virtual = viafb_second_xres;
 
1854
                default_var.yres_virtual = viafb_second_yres;
1843
1855
                default_var.bits_per_pixel = viafb_bpp1;
1844
 
                default_var.pixclock =
1845
 
                    viafb_get_pixclock(viafb_second_xres, viafb_second_yres,
1846
 
                    viafb_refresh);
1847
 
                default_var.left_margin = (viafb_second_xres >> 3) & 0xf8;
1848
 
                default_var.right_margin = 32;
1849
 
                default_var.upper_margin = 16;
1850
 
                default_var.lower_margin = 4;
1851
 
                default_var.hsync_len = default_var.left_margin;
1852
 
                default_var.vsync_len = 4;
 
1856
                viafb_fill_var_timing_info(&default_var, viafb_get_refresh(
 
1857
                        default_var.xres, default_var.yres, viafb_refresh1),
 
1858
                        viafb_get_mode(default_var.xres, default_var.yres));
1853
1859
 
1854
1860
                viafb_setup_fixinfo(&viafbinfo1->fix, viaparinfo1);
1855
1861
                viafb_check_var(&default_var, viafbinfo1);
1927
1933
}
1928
1934
 
1929
1935
#ifndef MODULE
1930
 
static int __init viafb_setup(char *options)
 
1936
static int __init viafb_setup(void)
1931
1937
{
1932
1938
        char *this_opt;
 
1939
        char *options;
 
1940
 
1933
1941
        DEBUG_MSG(KERN_INFO "viafb_setup!\n");
1934
1942
 
 
1943
        if (fb_get_options("viafb", &options))
 
1944
                return -ENODEV;
 
1945
 
1935
1946
        if (!options || !*options)
1936
1947
                return 0;
1937
1948
 
2004
2015
 */
2005
2016
int __init viafb_init(void)
2006
2017
{
2007
 
        u32 dummy;
 
2018
        u32 dummy_x, dummy_y;
 
2019
        int r;
 
2020
 
 
2021
        if (machine_is_olpc())
 
2022
                /* Apply XO-1.5-specific configuration. */
 
2023
                viafb_lcd_panel_id = 23;
 
2024
 
2008
2025
#ifndef MODULE
2009
 
        char *option = NULL;
2010
 
        if (fb_get_options("viafb", &option))
2011
 
                return -ENODEV;
2012
 
        viafb_setup(option);
 
2026
        r = viafb_setup();
 
2027
        if (r < 0)
 
2028
                return r;
2013
2029
#endif
2014
 
        if (parse_mode(viafb_mode, &dummy, &dummy)
2015
 
                || parse_mode(viafb_mode1, &dummy, &dummy)
 
2030
        if (parse_mode(viafb_mode, &dummy_x, &dummy_y)
 
2031
                || !viafb_get_mode(dummy_x, dummy_y)
 
2032
                || parse_mode(viafb_mode1, &dummy_x, &dummy_y)
 
2033
                || !viafb_get_mode(dummy_x, dummy_y)
2016
2034
                || viafb_bpp < 0 || viafb_bpp > 32
2017
2035
                || viafb_bpp1 < 0 || viafb_bpp1 > 32
2018
2036
                || parse_active_dev())
2019
2037
                return -EINVAL;
2020
2038
 
2021
2039
        printk(KERN_INFO
2022
 
       "VIA Graphics Intergration Chipset framebuffer %d.%d initializing\n",
 
2040
       "VIA Graphics Integration Chipset framebuffer %d.%d initializing\n",
2023
2041
               VERSION_MAJOR, VERSION_MINOR);
2024
2042
        return 0;
2025
2043
}