37
38
static int viafb_bpp = 32;
38
39
static int viafb_bpp1 = 32;
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;
43
46
static int viafb_accel = 1;
45
48
/* Added for specifying active devices.*/
46
char *viafb_active_dev;
49
static char *viafb_active_dev;
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 = "";
52
55
static void retrieve_device_setting(struct viafb_ioctl_setting
188
static inline int get_var_refresh(struct fb_var_screeninfo *var)
192
htotal = var->left_margin + var->xres + var->right_margin
194
vtotal = var->upper_margin + var->yres + var->lower_margin
196
return PICOS2KHZ(var->pixclock) * 1000 / (htotal * vtotal);
185
199
static int viafb_check_var(struct fb_var_screeninfo *var,
186
200
struct fb_info *info)
188
int htotal, vtotal, depth;
189
203
struct VideoModeTable *vmode_entry;
190
204
struct viafb_par *ppar = info->par;
191
u32 long_refresh, line;
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.
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);
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));
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;
254
262
struct viafb_par *viapar = info->par;
255
263
struct VideoModeTable *vmode_entry, *vmode_entry1 = NULL;
256
265
DEBUG_MSG(KERN_INFO "viafb_set_par!\n");
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);
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,
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);
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);
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;
295
viafb_refresh1 = refresh;
285
297
viafb_bpp = info->var.bits_per_pixel;
298
viafb_refresh = refresh;
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;
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",
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;
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;
1019
viafb_CRT_ON = STATE_ON;
1020
viafb_SAMM_ON = STATE_OFF;
1005
1022
} else if (!strcmp(viafb_active_dev, "CRT+DVI")) {
1007
1024
viafb_CRT_ON = STATE_ON;
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;
1741
1762
if (viafb_dual_fb)
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);
1789
viafb_second_virtual_xres = viafb_second_xres;
1790
viafb_second_virtual_yres = viafb_second_yres;
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;
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,
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));
1854
1860
viafb_setup_fixinfo(&viafbinfo1->fix, viaparinfo1);
1855
1861
viafb_check_var(&default_var, viafbinfo1);
1930
static int __init viafb_setup(char *options)
1936
static int __init viafb_setup(void)
1932
1938
char *this_opt;
1933
1941
DEBUG_MSG(KERN_INFO "viafb_setup!\n");
1943
if (fb_get_options("viafb", &options))
1935
1946
if (!options || !*options)
2005
2016
int __init viafb_init(void)
2018
u32 dummy_x, dummy_y;
2021
if (machine_is_olpc())
2022
/* Apply XO-1.5-specific configuration. */
2023
viafb_lcd_panel_id = 23;
2009
char *option = NULL;
2010
if (fb_get_options("viafb", &option))
2012
viafb_setup(option);
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;
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);