diff options
Diffstat (limited to 'drivers/video/via/dvi.c')
-rw-r--r-- | drivers/video/via/dvi.c | 160 |
1 files changed, 12 insertions, 148 deletions
diff --git a/drivers/video/via/dvi.c b/drivers/video/via/dvi.c index 41ca198b5098..b1f364745ca0 100644 --- a/drivers/video/via/dvi.c +++ b/drivers/video/via/dvi.c | |||
@@ -28,17 +28,11 @@ static int tmds_register_read_bytes(int index, u8 *buff, int buff_len); | |||
28 | static void __devinit dvi_get_panel_size_from_DDCv1( | 28 | static void __devinit dvi_get_panel_size_from_DDCv1( |
29 | struct tmds_chip_information *tmds_chip, | 29 | struct tmds_chip_information *tmds_chip, |
30 | struct tmds_setting_information *tmds_setting); | 30 | struct tmds_setting_information *tmds_setting); |
31 | static void __devinit dvi_get_panel_size_from_DDCv2( | ||
32 | struct tmds_chip_information *tmds_chip, | ||
33 | struct tmds_setting_information *tmds_setting); | ||
34 | static int viafb_dvi_query_EDID(void); | 31 | static int viafb_dvi_query_EDID(void); |
35 | 32 | ||
36 | static int check_tmds_chip(int device_id_subaddr, int device_id) | 33 | static inline bool check_tmds_chip(int device_id_subaddr, int device_id) |
37 | { | 34 | { |
38 | if (tmds_register_read(device_id_subaddr) == device_id) | 35 | return tmds_register_read(device_id_subaddr) == device_id; |
39 | return OK; | ||
40 | else | ||
41 | return FAIL; | ||
42 | } | 36 | } |
43 | 37 | ||
44 | void __devinit viafb_init_dvi_size(struct tmds_chip_information *tmds_chip, | 38 | void __devinit viafb_init_dvi_size(struct tmds_chip_information *tmds_chip, |
@@ -47,22 +41,13 @@ void __devinit viafb_init_dvi_size(struct tmds_chip_information *tmds_chip, | |||
47 | DEBUG_MSG(KERN_INFO "viafb_init_dvi_size()\n"); | 41 | DEBUG_MSG(KERN_INFO "viafb_init_dvi_size()\n"); |
48 | 42 | ||
49 | viafb_dvi_sense(); | 43 | viafb_dvi_sense(); |
50 | switch (viafb_dvi_query_EDID()) { | 44 | if (viafb_dvi_query_EDID() == 1) |
51 | case 1: | ||
52 | dvi_get_panel_size_from_DDCv1(tmds_chip, tmds_setting); | 45 | dvi_get_panel_size_from_DDCv1(tmds_chip, tmds_setting); |
53 | break; | ||
54 | case 2: | ||
55 | dvi_get_panel_size_from_DDCv2(tmds_chip, tmds_setting); | ||
56 | break; | ||
57 | default: | ||
58 | printk(KERN_WARNING "viafb_init_dvi_size: DVI panel size undetected!\n"); | ||
59 | break; | ||
60 | } | ||
61 | 46 | ||
62 | return; | 47 | return; |
63 | } | 48 | } |
64 | 49 | ||
65 | int __devinit viafb_tmds_trasmitter_identify(void) | 50 | bool __devinit viafb_tmds_trasmitter_identify(void) |
66 | { | 51 | { |
67 | unsigned char sr2a = 0, sr1e = 0, sr3e = 0; | 52 | unsigned char sr2a = 0, sr1e = 0, sr3e = 0; |
68 | 53 | ||
@@ -101,7 +86,7 @@ int __devinit viafb_tmds_trasmitter_identify(void) | |||
101 | viaparinfo->chip_info-> | 86 | viaparinfo->chip_info-> |
102 | tmds_chip_info.tmds_chip_slave_addr = VT1632_TMDS_I2C_ADDR; | 87 | tmds_chip_info.tmds_chip_slave_addr = VT1632_TMDS_I2C_ADDR; |
103 | viaparinfo->chip_info->tmds_chip_info.i2c_port = VIA_PORT_31; | 88 | viaparinfo->chip_info->tmds_chip_info.i2c_port = VIA_PORT_31; |
104 | if (check_tmds_chip(VT1632_DEVICE_ID_REG, VT1632_DEVICE_ID) != FAIL) { | 89 | if (check_tmds_chip(VT1632_DEVICE_ID_REG, VT1632_DEVICE_ID)) { |
105 | /* | 90 | /* |
106 | * Currently only support 12bits,dual edge,add 24bits mode later | 91 | * Currently only support 12bits,dual edge,add 24bits mode later |
107 | */ | 92 | */ |
@@ -112,11 +97,10 @@ int __devinit viafb_tmds_trasmitter_identify(void) | |||
112 | viaparinfo->chip_info->tmds_chip_info.tmds_chip_name); | 97 | viaparinfo->chip_info->tmds_chip_info.tmds_chip_name); |
113 | DEBUG_MSG(KERN_INFO "\n %2d", | 98 | DEBUG_MSG(KERN_INFO "\n %2d", |
114 | viaparinfo->chip_info->tmds_chip_info.i2c_port); | 99 | viaparinfo->chip_info->tmds_chip_info.i2c_port); |
115 | return OK; | 100 | return true; |
116 | } else { | 101 | } else { |
117 | viaparinfo->chip_info->tmds_chip_info.i2c_port = VIA_PORT_2C; | 102 | viaparinfo->chip_info->tmds_chip_info.i2c_port = VIA_PORT_2C; |
118 | if (check_tmds_chip(VT1632_DEVICE_ID_REG, VT1632_DEVICE_ID) | 103 | if (check_tmds_chip(VT1632_DEVICE_ID_REG, VT1632_DEVICE_ID)) { |
119 | != FAIL) { | ||
120 | tmds_register_write(0x08, 0x3b); | 104 | tmds_register_write(0x08, 0x3b); |
121 | DEBUG_MSG(KERN_INFO "\n VT1632 TMDS ! \n"); | 105 | DEBUG_MSG(KERN_INFO "\n VT1632 TMDS ! \n"); |
122 | DEBUG_MSG(KERN_INFO "\n %2d", | 106 | DEBUG_MSG(KERN_INFO "\n %2d", |
@@ -125,7 +109,7 @@ int __devinit viafb_tmds_trasmitter_identify(void) | |||
125 | DEBUG_MSG(KERN_INFO "\n %2d", | 109 | DEBUG_MSG(KERN_INFO "\n %2d", |
126 | viaparinfo->chip_info-> | 110 | viaparinfo->chip_info-> |
127 | tmds_chip_info.i2c_port); | 111 | tmds_chip_info.i2c_port); |
128 | return OK; | 112 | return true; |
129 | } | 113 | } |
130 | } | 114 | } |
131 | 115 | ||
@@ -135,7 +119,7 @@ int __devinit viafb_tmds_trasmitter_identify(void) | |||
135 | ((viafb_display_hardware_layout == HW_LAYOUT_DVI_ONLY) || | 119 | ((viafb_display_hardware_layout == HW_LAYOUT_DVI_ONLY) || |
136 | (viafb_display_hardware_layout == HW_LAYOUT_LCD_DVI))) { | 120 | (viafb_display_hardware_layout == HW_LAYOUT_LCD_DVI))) { |
137 | DEBUG_MSG(KERN_INFO "\n Integrated TMDS ! \n"); | 121 | DEBUG_MSG(KERN_INFO "\n Integrated TMDS ! \n"); |
138 | return OK; | 122 | return true; |
139 | } | 123 | } |
140 | 124 | ||
141 | switch (viaparinfo->chip_info->gfx_chip_name) { | 125 | switch (viaparinfo->chip_info->gfx_chip_name) { |
@@ -159,7 +143,7 @@ int __devinit viafb_tmds_trasmitter_identify(void) | |||
159 | tmds_chip_info.tmds_chip_name = NON_TMDS_TRANSMITTER; | 143 | tmds_chip_info.tmds_chip_name = NON_TMDS_TRANSMITTER; |
160 | viaparinfo->chip_info->tmds_chip_info. | 144 | viaparinfo->chip_info->tmds_chip_info. |
161 | tmds_chip_slave_addr = VT1632_TMDS_I2C_ADDR; | 145 | tmds_chip_slave_addr = VT1632_TMDS_I2C_ADDR; |
162 | return FAIL; | 146 | return false; |
163 | } | 147 | } |
164 | 148 | ||
165 | static void tmds_register_write(int index, u8 data) | 149 | static void tmds_register_write(int index, u8 data) |
@@ -306,12 +290,7 @@ static int viafb_dvi_query_EDID(void) | |||
306 | return EDID_VERSION_1; /* Found EDID1 Table */ | 290 | return EDID_VERSION_1; /* Found EDID1 Table */ |
307 | } | 291 | } |
308 | 292 | ||
309 | data0 = (u8) tmds_register_read(0x00); | 293 | return false; |
310 | viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr = restore; | ||
311 | if (data0 == 0x20) | ||
312 | return EDID_VERSION_2; /* Found EDID2 Table */ | ||
313 | else | ||
314 | return false; | ||
315 | } | 294 | } |
316 | 295 | ||
317 | /* Get Panel Size Using EDID1 Table */ | 296 | /* Get Panel Size Using EDID1 Table */ |
@@ -319,50 +298,15 @@ static void __devinit dvi_get_panel_size_from_DDCv1( | |||
319 | struct tmds_chip_information *tmds_chip, | 298 | struct tmds_chip_information *tmds_chip, |
320 | struct tmds_setting_information *tmds_setting) | 299 | struct tmds_setting_information *tmds_setting) |
321 | { | 300 | { |
322 | int i, max_h = 0, tmp, restore; | 301 | int i, restore; |
323 | unsigned char rData; | ||
324 | unsigned char EDID_DATA[18]; | 302 | unsigned char EDID_DATA[18]; |
325 | 303 | ||
326 | DEBUG_MSG(KERN_INFO "\n dvi_get_panel_size_from_DDCv1 \n"); | 304 | DEBUG_MSG(KERN_INFO "\n dvi_get_panel_size_from_DDCv1 \n"); |
327 | 305 | ||
328 | restore = tmds_chip->tmds_chip_slave_addr; | 306 | restore = tmds_chip->tmds_chip_slave_addr; |
329 | tmds_chip->tmds_chip_slave_addr = 0xA0; | 307 | tmds_chip->tmds_chip_slave_addr = 0xA0; |
330 | |||
331 | rData = tmds_register_read(0x23); | ||
332 | if (rData & 0x3C) | ||
333 | max_h = 640; | ||
334 | if (rData & 0xC0) | ||
335 | max_h = 720; | ||
336 | if (rData & 0x03) | ||
337 | max_h = 800; | ||
338 | |||
339 | rData = tmds_register_read(0x24); | ||
340 | if (rData & 0xC0) | ||
341 | max_h = 800; | ||
342 | if (rData & 0x1E) | ||
343 | max_h = 1024; | ||
344 | if (rData & 0x01) | ||
345 | max_h = 1280; | ||
346 | |||
347 | for (i = 0x25; i < 0x6D; i++) { | 308 | for (i = 0x25; i < 0x6D; i++) { |
348 | switch (i) { | 309 | switch (i) { |
349 | case 0x26: | ||
350 | case 0x28: | ||
351 | case 0x2A: | ||
352 | case 0x2C: | ||
353 | case 0x2E: | ||
354 | case 0x30: | ||
355 | case 0x32: | ||
356 | case 0x34: | ||
357 | rData = tmds_register_read(i); | ||
358 | if (rData == 1) | ||
359 | break; | ||
360 | /* data = (data + 31) * 8 */ | ||
361 | tmp = (rData + 31) << 3; | ||
362 | if (tmp > max_h) | ||
363 | max_h = tmp; | ||
364 | break; | ||
365 | |||
366 | case 0x36: | 310 | case 0x36: |
367 | case 0x48: | 311 | case 0x48: |
368 | case 0x5A: | 312 | case 0x5A: |
@@ -383,91 +327,11 @@ static void __devinit dvi_get_panel_size_from_DDCv1( | |||
383 | } | 327 | } |
384 | } | 328 | } |
385 | 329 | ||
386 | tmds_setting->max_hres = max_h; | ||
387 | switch (max_h) { | ||
388 | case 640: | ||
389 | tmds_setting->max_vres = 480; | ||
390 | break; | ||
391 | case 800: | ||
392 | tmds_setting->max_vres = 600; | ||
393 | break; | ||
394 | case 1024: | ||
395 | tmds_setting->max_vres = 768; | ||
396 | break; | ||
397 | case 1280: | ||
398 | tmds_setting->max_vres = 1024; | ||
399 | break; | ||
400 | case 1400: | ||
401 | tmds_setting->max_vres = 1050; | ||
402 | break; | ||
403 | case 1440: | ||
404 | tmds_setting->max_vres = 1050; | ||
405 | break; | ||
406 | case 1600: | ||
407 | tmds_setting->max_vres = 1200; | ||
408 | break; | ||
409 | case 1920: | ||
410 | tmds_setting->max_vres = 1080; | ||
411 | break; | ||
412 | default: | ||
413 | DEBUG_MSG(KERN_INFO "Unknown panel size max resolution = %d ! " | ||
414 | "set default panel size.\n", max_h); | ||
415 | break; | ||
416 | } | ||
417 | |||
418 | DEBUG_MSG(KERN_INFO "DVI max pixelclock = %d\n", | 330 | DEBUG_MSG(KERN_INFO "DVI max pixelclock = %d\n", |
419 | tmds_setting->max_pixel_clock); | 331 | tmds_setting->max_pixel_clock); |
420 | tmds_chip->tmds_chip_slave_addr = restore; | 332 | tmds_chip->tmds_chip_slave_addr = restore; |
421 | } | 333 | } |
422 | 334 | ||
423 | /* Get Panel Size Using EDID2 Table */ | ||
424 | static void __devinit dvi_get_panel_size_from_DDCv2( | ||
425 | struct tmds_chip_information *tmds_chip, | ||
426 | struct tmds_setting_information *tmds_setting) | ||
427 | { | ||
428 | int restore; | ||
429 | unsigned char R_Buffer[2]; | ||
430 | |||
431 | DEBUG_MSG(KERN_INFO "\n dvi_get_panel_size_from_DDCv2 \n"); | ||
432 | |||
433 | restore = tmds_chip->tmds_chip_slave_addr; | ||
434 | tmds_chip->tmds_chip_slave_addr = 0xA2; | ||
435 | |||
436 | /* Horizontal: 0x76, 0x77 */ | ||
437 | tmds_register_read_bytes(0x76, R_Buffer, 2); | ||
438 | tmds_setting->max_hres = R_Buffer[0] + (R_Buffer[1] << 8); | ||
439 | |||
440 | switch (tmds_setting->max_hres) { | ||
441 | case 640: | ||
442 | tmds_setting->max_vres = 480; | ||
443 | break; | ||
444 | case 800: | ||
445 | tmds_setting->max_vres = 600; | ||
446 | break; | ||
447 | case 1024: | ||
448 | tmds_setting->max_vres = 768; | ||
449 | break; | ||
450 | case 1280: | ||
451 | tmds_setting->max_vres = 1024; | ||
452 | break; | ||
453 | case 1400: | ||
454 | tmds_setting->max_vres = 1050; | ||
455 | break; | ||
456 | case 1440: | ||
457 | tmds_setting->max_vres = 1050; | ||
458 | break; | ||
459 | case 1600: | ||
460 | tmds_setting->max_vres = 1200; | ||
461 | break; | ||
462 | default: | ||
463 | DEBUG_MSG(KERN_INFO "Unknown panel size max resolution = %d! " | ||
464 | "set default panel size.\n", tmds_setting->max_hres); | ||
465 | break; | ||
466 | } | ||
467 | |||
468 | tmds_chip->tmds_chip_slave_addr = restore; | ||
469 | } | ||
470 | |||
471 | /* If Disable DVI, turn off pad */ | 335 | /* If Disable DVI, turn off pad */ |
472 | void viafb_dvi_disable(void) | 336 | void viafb_dvi_disable(void) |
473 | { | 337 | { |