aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/video/intelfb/intelfb.h12
-rw-r--r--drivers/video/intelfb/intelfb_i2c.c60
-rw-r--r--drivers/video/intelfb/intelfbdrv.c178
-rw-r--r--drivers/video/intelfb/intelfbhw.c190
-rw-r--r--drivers/video/intelfb/intelfbhw.h14
5 files changed, 202 insertions, 252 deletions
diff --git a/drivers/video/intelfb/intelfb.h b/drivers/video/intelfb/intelfb.h
index 6148300fadd6..7e9d62a83472 100644
--- a/drivers/video/intelfb/intelfb.h
+++ b/drivers/video/intelfb/intelfb.h
@@ -231,8 +231,8 @@ struct intelfb_hwstate {
231struct intelfb_heap_data { 231struct intelfb_heap_data {
232 u32 physical; 232 u32 physical;
233 u8 __iomem *virtual; 233 u8 __iomem *virtual;
234 u32 offset; // in GATT pages 234 u32 offset; /* in GATT pages */
235 u32 size; // in bytes 235 u32 size; /* in bytes */
236}; 236};
237 237
238#ifdef CONFIG_FB_INTEL_I2C 238#ifdef CONFIG_FB_INTEL_I2C
@@ -270,9 +270,9 @@ struct intelfb_info {
270 struct intelfb_hwstate save_state; 270 struct intelfb_hwstate save_state;
271 271
272 /* agpgart structs */ 272 /* agpgart structs */
273 struct agp_memory *gtt_fb_mem; // use all stolen memory or vram 273 struct agp_memory *gtt_fb_mem; /* use all stolen memory or vram */
274 struct agp_memory *gtt_ring_mem; // ring buffer 274 struct agp_memory *gtt_ring_mem; /* ring buffer */
275 struct agp_memory *gtt_cursor_mem; // hw cursor 275 struct agp_memory *gtt_cursor_mem; /* hw cursor */
276 276
277 /* use a gart reserved fb mem */ 277 /* use a gart reserved fb mem */
278 u8 fbmem_gart; 278 u8 fbmem_gart;
@@ -346,7 +346,7 @@ struct intelfb_info {
346 346
347 /* driver registered */ 347 /* driver registered */
348 int registered; 348 int registered;
349 349
350 /* index into plls */ 350 /* index into plls */
351 int pll_index; 351 int pll_index;
352 352
diff --git a/drivers/video/intelfb/intelfb_i2c.c b/drivers/video/intelfb/intelfb_i2c.c
index 61e4c8759b23..94c08bb5acf1 100644
--- a/drivers/video/intelfb/intelfb_i2c.c
+++ b/drivers/video/intelfb/intelfb_i2c.c
@@ -58,7 +58,8 @@ static void intelfb_gpio_setscl(void *data, int state)
58 struct intelfb_info *dinfo = chan->dinfo; 58 struct intelfb_info *dinfo = chan->dinfo;
59 u32 val; 59 u32 val;
60 60
61 OUTREG(chan->reg, (state ? SCL_VAL_OUT : 0) | SCL_DIR | SCL_DIR_MASK | SCL_VAL_MASK); 61 OUTREG(chan->reg, (state ? SCL_VAL_OUT : 0) |
62 SCL_DIR | SCL_DIR_MASK | SCL_VAL_MASK);
62 val = INREG(chan->reg); 63 val = INREG(chan->reg);
63} 64}
64 65
@@ -68,7 +69,8 @@ static void intelfb_gpio_setsda(void *data, int state)
68 struct intelfb_info *dinfo = chan->dinfo; 69 struct intelfb_info *dinfo = chan->dinfo;
69 u32 val; 70 u32 val;
70 71
71 OUTREG(chan->reg, (state ? SDA_VAL_OUT : 0) | SDA_DIR | SDA_DIR_MASK | SDA_VAL_MASK); 72 OUTREG(chan->reg, (state ? SDA_VAL_OUT : 0) |
73 SDA_DIR | SDA_DIR_MASK | SDA_VAL_MASK);
72 val = INREG(chan->reg); 74 val = INREG(chan->reg);
73} 75}
74 76
@@ -97,26 +99,26 @@ static int intelfb_gpio_getsda(void *data)
97} 99}
98 100
99static int intelfb_setup_i2c_bus(struct intelfb_info *dinfo, 101static int intelfb_setup_i2c_bus(struct intelfb_info *dinfo,
100 struct intelfb_i2c_chan *chan, 102 struct intelfb_i2c_chan *chan,
101 const u32 reg, const char *name) 103 const u32 reg, const char *name)
102{ 104{
103 int rc; 105 int rc;
104 106
105 chan->dinfo = dinfo; 107 chan->dinfo = dinfo;
106 chan->reg = reg; 108 chan->reg = reg;
107 snprintf(chan->adapter.name, sizeof(chan->adapter.name), 109 snprintf(chan->adapter.name, sizeof(chan->adapter.name),
108 "intelfb %s", name); 110 "intelfb %s", name);
109 chan->adapter.owner = THIS_MODULE; 111 chan->adapter.owner = THIS_MODULE;
110 chan->adapter.id = I2C_HW_B_INTELFB; 112 chan->adapter.id = I2C_HW_B_INTELFB;
111 chan->adapter.algo_data = &chan->algo; 113 chan->adapter.algo_data = &chan->algo;
112 chan->adapter.dev.parent = &chan->dinfo->pdev->dev; 114 chan->adapter.dev.parent = &chan->dinfo->pdev->dev;
113 chan->algo.setsda = intelfb_gpio_setsda; 115 chan->algo.setsda = intelfb_gpio_setsda;
114 chan->algo.setscl = intelfb_gpio_setscl; 116 chan->algo.setscl = intelfb_gpio_setscl;
115 chan->algo.getsda = intelfb_gpio_getsda; 117 chan->algo.getsda = intelfb_gpio_getsda;
116 chan->algo.getscl = intelfb_gpio_getscl; 118 chan->algo.getscl = intelfb_gpio_getscl;
117 chan->algo.udelay = 40; 119 chan->algo.udelay = 40;
118 chan->algo.timeout = 20; 120 chan->algo.timeout = 20;
119 chan->algo.data = chan; 121 chan->algo.data = chan;
120 122
121 i2c_set_adapdata(&chan->adapter, chan); 123 i2c_set_adapdata(&chan->adapter, chan);
122 124
@@ -142,40 +144,44 @@ void intelfb_create_i2c_busses(struct intelfb_info *dinfo)
142 dinfo->output[i].type = INTELFB_OUTPUT_ANALOG; 144 dinfo->output[i].type = INTELFB_OUTPUT_ANALOG;
143 145
144 /* setup the DDC bus for analog output */ 146 /* setup the DDC bus for analog output */
145 intelfb_setup_i2c_bus(dinfo, &dinfo->output[i].ddc_bus, GPIOA, "CRTDDC_A"); 147 intelfb_setup_i2c_bus(dinfo, &dinfo->output[i].ddc_bus, GPIOA,
148 "CRTDDC_A");
146 i++; 149 i++;
147 150
148 /* need to add the output busses for each device 151 /* need to add the output busses for each device
149 - this function is very incomplete 152 - this function is very incomplete
150 - i915GM has LVDS and TVOUT for example 153 - i915GM has LVDS and TVOUT for example
151 */ 154 */
152 switch(dinfo->chipset) { 155 switch(dinfo->chipset) {
153 case INTEL_830M: 156 case INTEL_830M:
154 case INTEL_845G: 157 case INTEL_845G:
155 case INTEL_855GM: 158 case INTEL_855GM:
156 case INTEL_865G: 159 case INTEL_865G:
157 dinfo->output[i].type = INTELFB_OUTPUT_DVO; 160 dinfo->output[i].type = INTELFB_OUTPUT_DVO;
158 intelfb_setup_i2c_bus(dinfo, &dinfo->output[i].ddc_bus, GPIOD, "DVODDC_D"); 161 intelfb_setup_i2c_bus(dinfo, &dinfo->output[i].ddc_bus,
159 intelfb_setup_i2c_bus(dinfo, &dinfo->output[i].i2c_bus, GPIOE, "DVOI2C_E"); 162 GPIOD, "DVODDC_D");
163 intelfb_setup_i2c_bus(dinfo, &dinfo->output[i].i2c_bus,
164 GPIOE, "DVOI2C_E");
160 i++; 165 i++;
161 break; 166 break;
162 case INTEL_915G: 167 case INTEL_915G:
163 case INTEL_915GM: 168 case INTEL_915GM:
164 /* has some LVDS + tv-out */ 169 /* has some LVDS + tv-out */
165 case INTEL_945G: 170 case INTEL_945G:
166 case INTEL_945GM: 171 case INTEL_945GM:
167 /* SDVO ports have a single control bus - 2 devices */ 172 /* SDVO ports have a single control bus - 2 devices */
168 dinfo->output[i].type = INTELFB_OUTPUT_SDVO; 173 dinfo->output[i].type = INTELFB_OUTPUT_SDVO;
169 intelfb_setup_i2c_bus(dinfo, &dinfo->output[i].i2c_bus, GPIOE, "SDVOCTRL_E"); 174 intelfb_setup_i2c_bus(dinfo, &dinfo->output[i].i2c_bus,
175 GPIOE, "SDVOCTRL_E");
170 /* TODO: initialize the SDVO */ 176 /* TODO: initialize the SDVO */
171// I830SDVOInit(pScrn, i, DVOB); 177 /* I830SDVOInit(pScrn, i, DVOB); */
172 i++; 178 i++;
173 179
174 /* set up SDVOC */ 180 /* set up SDVOC */
175 dinfo->output[i].type = INTELFB_OUTPUT_SDVO; 181 dinfo->output[i].type = INTELFB_OUTPUT_SDVO;
176 dinfo->output[i].i2c_bus = dinfo->output[i - 1].i2c_bus; 182 dinfo->output[i].i2c_bus = dinfo->output[i - 1].i2c_bus;
177 /* TODO: initialize the SDVO */ 183 /* TODO: initialize the SDVO */
178// I830SDVOInit(pScrn, i, DVOC); 184 /* I830SDVOInit(pScrn, i, DVOC); */
179 i++; 185 i++;
180 break; 186 break;
181 } 187 }
diff --git a/drivers/video/intelfb/intelfbdrv.c b/drivers/video/intelfb/intelfbdrv.c
index b75eda84858f..0428f211f192 100644
--- a/drivers/video/intelfb/intelfbdrv.c
+++ b/drivers/video/intelfb/intelfbdrv.c
@@ -99,13 +99,6 @@
99 * Add vram option to reserve more memory than stolen by BIOS 99 * Add vram option to reserve more memory than stolen by BIOS
100 * Fix intelfbhw_pan_display typo 100 * Fix intelfbhw_pan_display typo
101 * Add __initdata annotations 101 * Add __initdata annotations
102 *
103 * TODO:
104 *
105 *
106 * Wish List:
107 *
108 *
109 */ 102 */
110 103
111#include <linux/module.h> 104#include <linux/module.h>
@@ -222,8 +215,8 @@ static struct pci_driver intelfb_driver = {
222/* Module description/parameters */ 215/* Module description/parameters */
223MODULE_AUTHOR("David Dawes <dawes@tungstengraphics.com>, " 216MODULE_AUTHOR("David Dawes <dawes@tungstengraphics.com>, "
224 "Sylvain Meyer <sylvain.meyer@worldonline.fr>"); 217 "Sylvain Meyer <sylvain.meyer@worldonline.fr>");
225MODULE_DESCRIPTION( 218MODULE_DESCRIPTION("Framebuffer driver for Intel(R) " SUPPORTED_CHIPSETS
226 "Framebuffer driver for Intel(R) " SUPPORTED_CHIPSETS " chipsets"); 219 " chipsets");
227MODULE_LICENSE("Dual BSD/GPL"); 220MODULE_LICENSE("Dual BSD/GPL");
228MODULE_DEVICE_TABLE(pci, intelfb_pci_table); 221MODULE_DEVICE_TABLE(pci, intelfb_pci_table);
229 222
@@ -271,8 +264,7 @@ MODULE_PARM_DESC(mode,
271#define OPT_INTVAL(opt, name) simple_strtoul(opt + strlen(name) + 1, NULL, 0) 264#define OPT_INTVAL(opt, name) simple_strtoul(opt + strlen(name) + 1, NULL, 0)
272#define OPT_STRVAL(opt, name) (opt + strlen(name)) 265#define OPT_STRVAL(opt, name) (opt + strlen(name))
273 266
274static __inline__ char * 267static __inline__ char * get_opt_string(const char *this_opt, const char *name)
275get_opt_string(const char *this_opt, const char *name)
276{ 268{
277 const char *p; 269 const char *p;
278 int i; 270 int i;
@@ -290,8 +282,8 @@ get_opt_string(const char *this_opt, const char *name)
290 return ret; 282 return ret;
291} 283}
292 284
293static __inline__ int 285static __inline__ int get_opt_int(const char *this_opt, const char *name,
294get_opt_int(const char *this_opt, const char *name, int *ret) 286 int *ret)
295{ 287{
296 if (!ret) 288 if (!ret)
297 return 0; 289 return 0;
@@ -303,8 +295,8 @@ get_opt_int(const char *this_opt, const char *name, int *ret)
303 return 1; 295 return 1;
304} 296}
305 297
306static __inline__ int 298static __inline__ int get_opt_bool(const char *this_opt, const char *name,
307get_opt_bool(const char *this_opt, const char *name, int *ret) 299 int *ret)
308{ 300{
309 if (!ret) 301 if (!ret)
310 return 0; 302 return 0;
@@ -324,8 +316,7 @@ get_opt_bool(const char *this_opt, const char *name, int *ret)
324 return 1; 316 return 1;
325} 317}
326 318
327static int __init 319static int __init intelfb_setup(char *options)
328intelfb_setup(char *options)
329{ 320{
330 char *this_opt; 321 char *this_opt;
331 322
@@ -355,7 +346,7 @@ intelfb_setup(char *options)
355 continue; 346 continue;
356 if (get_opt_bool(this_opt, "accel", &accel)) 347 if (get_opt_bool(this_opt, "accel", &accel))
357 ; 348 ;
358 else if (get_opt_int(this_opt, "vram", &vram)) 349 else if (get_opt_int(this_opt, "vram", &vram))
359 ; 350 ;
360 else if (get_opt_bool(this_opt, "hwcursor", &hwcursor)) 351 else if (get_opt_bool(this_opt, "hwcursor", &hwcursor))
361 ; 352 ;
@@ -376,8 +367,7 @@ intelfb_setup(char *options)
376 367
377#endif 368#endif
378 369
379static int __init 370static int __init intelfb_init(void)
380intelfb_init(void)
381{ 371{
382#ifndef MODULE 372#ifndef MODULE
383 char *option = NULL; 373 char *option = NULL;
@@ -401,8 +391,7 @@ intelfb_init(void)
401 return pci_register_driver(&intelfb_driver); 391 return pci_register_driver(&intelfb_driver);
402} 392}
403 393
404static void __exit 394static void __exit intelfb_exit(void)
405intelfb_exit(void)
406{ 395{
407 DBG_MSG("intelfb_exit\n"); 396 DBG_MSG("intelfb_exit\n");
408 pci_unregister_driver(&intelfb_driver); 397 pci_unregister_driver(&intelfb_driver);
@@ -428,8 +417,8 @@ static inline void __devinit set_mtrr(struct intelfb_info *dinfo)
428} 417}
429static inline void unset_mtrr(struct intelfb_info *dinfo) 418static inline void unset_mtrr(struct intelfb_info *dinfo)
430{ 419{
431 if (dinfo->has_mtrr) 420 if (dinfo->has_mtrr)
432 mtrr_del(dinfo->mtrr_reg, dinfo->aperture.physical, 421 mtrr_del(dinfo->mtrr_reg, dinfo->aperture.physical,
433 dinfo->aperture.size); 422 dinfo->aperture.size);
434} 423}
435#else 424#else
@@ -442,8 +431,7 @@ static inline void unset_mtrr(struct intelfb_info *dinfo)
442 * driver init / cleanup * 431 * driver init / cleanup *
443 ***************************************************************/ 432 ***************************************************************/
444 433
445static void 434static void cleanup(struct intelfb_info *dinfo)
446cleanup(struct intelfb_info *dinfo)
447{ 435{
448 DBG_MSG("cleanup\n"); 436 DBG_MSG("cleanup\n");
449 437
@@ -499,8 +487,8 @@ cleanup(struct intelfb_info *dinfo)
499} while (0) 487} while (0)
500 488
501 489
502static int __devinit 490static int __devinit intelfb_pci_register(struct pci_dev *pdev,
503intelfb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent) 491 const struct pci_device_id *ent)
504{ 492{
505 struct fb_info *info; 493 struct fb_info *info;
506 struct intelfb_info *dinfo; 494 struct intelfb_info *dinfo;
@@ -510,8 +498,8 @@ intelfb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
510 int agp_memtype; 498 int agp_memtype;
511 const char *s; 499 const char *s;
512 struct agp_bridge_data *bridge; 500 struct agp_bridge_data *bridge;
513 int aperture_bar = 0; 501 int aperture_bar = 0;
514 int mmio_bar = 1; 502 int mmio_bar = 1;
515 int offset; 503 int offset;
516 504
517 DBG_MSG("intelfb_pci_register\n"); 505 DBG_MSG("intelfb_pci_register\n");
@@ -637,9 +625,8 @@ intelfb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
637 dinfo->ring.size = RINGBUFFER_SIZE; 625 dinfo->ring.size = RINGBUFFER_SIZE;
638 dinfo->ring_tail_mask = dinfo->ring.size - 1; 626 dinfo->ring_tail_mask = dinfo->ring.size - 1;
639 } 627 }
640 if (dinfo->hwcursor) { 628 if (dinfo->hwcursor)
641 dinfo->cursor.size = HW_CURSOR_SIZE; 629 dinfo->cursor.size = HW_CURSOR_SIZE;
642 }
643 630
644 /* Use agpgart to manage the GATT */ 631 /* Use agpgart to manage the GATT */
645 if (!(bridge = agp_backend_acquire(pdev))) { 632 if (!(bridge = agp_backend_acquire(pdev))) {
@@ -662,18 +649,15 @@ intelfb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
662 offset = ROUND_UP_TO_PAGE(MB(voffset))/GTT_PAGE_SIZE; 649 offset = ROUND_UP_TO_PAGE(MB(voffset))/GTT_PAGE_SIZE;
663 650
664 /* set the mem offsets - set them after the already used pages */ 651 /* set the mem offsets - set them after the already used pages */
665 if (dinfo->accel) { 652 if (dinfo->accel)
666 dinfo->ring.offset = offset + gtt_info.current_memory; 653 dinfo->ring.offset = offset + gtt_info.current_memory;
667 } 654 if (dinfo->hwcursor)
668 if (dinfo->hwcursor) {
669 dinfo->cursor.offset = offset + 655 dinfo->cursor.offset = offset +
670 + gtt_info.current_memory + (dinfo->ring.size >> 12); 656 + gtt_info.current_memory + (dinfo->ring.size >> 12);
671 } 657 if (dinfo->fbmem_gart)
672 if (dinfo->fbmem_gart) {
673 dinfo->fb.offset = offset + 658 dinfo->fb.offset = offset +
674 + gtt_info.current_memory + (dinfo->ring.size >> 12) 659 + gtt_info.current_memory + (dinfo->ring.size >> 12)
675 + (dinfo->cursor.size >> 12); 660 + (dinfo->cursor.size >> 12);
676 }
677 661
678 /* Allocate memories (which aren't stolen) */ 662 /* Allocate memories (which aren't stolen) */
679 /* Map the fb and MMIO regions */ 663 /* Map the fb and MMIO regions */
@@ -689,7 +673,7 @@ intelfb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
689 673
690 dinfo->mmio_base = 674 dinfo->mmio_base =
691 (u8 __iomem *)ioremap_nocache(dinfo->mmio_base_phys, 675 (u8 __iomem *)ioremap_nocache(dinfo->mmio_base_phys,
692 INTEL_REG_SIZE); 676 INTEL_REG_SIZE);
693 if (!dinfo->mmio_base) { 677 if (!dinfo->mmio_base) {
694 ERR_MSG("Cannot remap MMIO region.\n"); 678 ERR_MSG("Cannot remap MMIO region.\n");
695 cleanup(dinfo); 679 cleanup(dinfo);
@@ -837,10 +821,8 @@ intelfb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
837 if (bailearly == 3) 821 if (bailearly == 3)
838 bailout(dinfo); 822 bailout(dinfo);
839 823
840 if (FIXED_MODE(dinfo)) { 824 if (FIXED_MODE(dinfo)) /* remap fb address */
841 /* remap fb address */
842 update_dinfo(dinfo, &dinfo->initial_var); 825 update_dinfo(dinfo, &dinfo->initial_var);
843 }
844 826
845 if (bailearly == 4) 827 if (bailearly == 4)
846 bailout(dinfo); 828 bailout(dinfo);
@@ -939,8 +921,7 @@ intelfb_pci_unregister(struct pci_dev *pdev)
939 * helper functions * 921 * helper functions *
940 ***************************************************************/ 922 ***************************************************************/
941 923
942int __inline__ 924int __inline__ intelfb_var_to_depth(const struct fb_var_screeninfo *var)
943intelfb_var_to_depth(const struct fb_var_screeninfo *var)
944{ 925{
945 DBG_MSG("intelfb_var_to_depth: bpp: %d, green.length is %d\n", 926 DBG_MSG("intelfb_var_to_depth: bpp: %d, green.length is %d\n",
946 var->bits_per_pixel, var->green.length); 927 var->bits_per_pixel, var->green.length);
@@ -956,8 +937,7 @@ intelfb_var_to_depth(const struct fb_var_screeninfo *var)
956} 937}
957 938
958 939
959static __inline__ int 940static __inline__ int var_to_refresh(const struct fb_var_screeninfo *var)
960var_to_refresh(const struct fb_var_screeninfo *var)
961{ 941{
962 int xtot = var->xres + var->left_margin + var->right_margin + 942 int xtot = var->xres + var->left_margin + var->right_margin +
963 var->hsync_len; 943 var->hsync_len;
@@ -971,8 +951,7 @@ var_to_refresh(const struct fb_var_screeninfo *var)
971 * Various intialisation functions * 951 * Various intialisation functions *
972 ***************************************************************/ 952 ***************************************************************/
973 953
974static void __devinit 954static void __devinit get_initial_mode(struct intelfb_info *dinfo)
975get_initial_mode(struct intelfb_info *dinfo)
976{ 955{
977 struct fb_var_screeninfo *var; 956 struct fb_var_screeninfo *var;
978 int xtot, ytot; 957 int xtot, ytot;
@@ -1039,8 +1018,7 @@ get_initial_mode(struct intelfb_info *dinfo)
1039 } 1018 }
1040} 1019}
1041 1020
1042static int __devinit 1021static int __devinit intelfb_init_var(struct intelfb_info *dinfo)
1043intelfb_init_var(struct intelfb_info *dinfo)
1044{ 1022{
1045 struct fb_var_screeninfo *var; 1023 struct fb_var_screeninfo *var;
1046 int msrc = 0; 1024 int msrc = 0;
@@ -1087,10 +1065,9 @@ intelfb_init_var(struct intelfb_info *dinfo)
1087 1065
1088 } 1066 }
1089 1067
1090 if (!msrc) { 1068 if (!msrc)
1091 msrc = fb_find_mode(var, dinfo->info, PREFERRED_MODE, 1069 msrc = fb_find_mode(var, dinfo->info, PREFERRED_MODE,
1092 NULL, 0, NULL, 0); 1070 NULL, 0, NULL, 0);
1093 }
1094 } 1071 }
1095 1072
1096 if (!msrc) { 1073 if (!msrc) {
@@ -1122,8 +1099,7 @@ intelfb_init_var(struct intelfb_info *dinfo)
1122 return 0; 1099 return 0;
1123} 1100}
1124 1101
1125static int __devinit 1102static int __devinit intelfb_set_fbinfo(struct intelfb_info *dinfo)
1126intelfb_set_fbinfo(struct intelfb_info *dinfo)
1127{ 1103{
1128 struct fb_info *info = dinfo->info; 1104 struct fb_info *info = dinfo->info;
1129 1105
@@ -1159,8 +1135,8 @@ intelfb_set_fbinfo(struct intelfb_info *dinfo)
1159} 1135}
1160 1136
1161/* Update dinfo to match the active video mode. */ 1137/* Update dinfo to match the active video mode. */
1162static void 1138static void update_dinfo(struct intelfb_info *dinfo,
1163update_dinfo(struct intelfb_info *dinfo, struct fb_var_screeninfo *var) 1139 struct fb_var_screeninfo *var)
1164{ 1140{
1165 DBG_MSG("update_dinfo\n"); 1141 DBG_MSG("update_dinfo\n");
1166 1142
@@ -1208,36 +1184,32 @@ update_dinfo(struct intelfb_info *dinfo, struct fb_var_screeninfo *var)
1208 * fbdev interface * 1184 * fbdev interface *
1209 ***************************************************************/ 1185 ***************************************************************/
1210 1186
1211static int 1187static int intelfb_open(struct fb_info *info, int user)
1212intelfb_open(struct fb_info *info, int user)
1213{ 1188{
1214 struct intelfb_info *dinfo = GET_DINFO(info); 1189 struct intelfb_info *dinfo = GET_DINFO(info);
1215 1190
1216 if (user) { 1191 if (user)
1217 dinfo->open++; 1192 dinfo->open++;
1218 }
1219 1193
1220 return 0; 1194 return 0;
1221} 1195}
1222 1196
1223static int 1197static int intelfb_release(struct fb_info *info, int user)
1224intelfb_release(struct fb_info *info, int user)
1225{ 1198{
1226 struct intelfb_info *dinfo = GET_DINFO(info); 1199 struct intelfb_info *dinfo = GET_DINFO(info);
1227 1200
1228 if (user) { 1201 if (user) {
1229 dinfo->open--; 1202 dinfo->open--;
1230 msleep(1); 1203 msleep(1);
1231 if (!dinfo->open) { 1204 if (!dinfo->open)
1232 intelfbhw_disable_irq(dinfo); 1205 intelfbhw_disable_irq(dinfo);
1233 }
1234 } 1206 }
1235 1207
1236 return 0; 1208 return 0;
1237} 1209}
1238 1210
1239static int 1211static int intelfb_check_var(struct fb_var_screeninfo *var,
1240intelfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) 1212 struct fb_info *info)
1241{ 1213{
1242 int change_var = 0; 1214 int change_var = 0;
1243 struct fb_var_screeninfo v; 1215 struct fb_var_screeninfo v;
@@ -1271,15 +1243,15 @@ intelfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
1271 } 1243 }
1272 1244
1273 /* Check for a supported bpp. */ 1245 /* Check for a supported bpp. */
1274 if (v.bits_per_pixel <= 8) { 1246 if (v.bits_per_pixel <= 8)
1275 v.bits_per_pixel = 8; 1247 v.bits_per_pixel = 8;
1276 } else if (v.bits_per_pixel <= 16) { 1248 else if (v.bits_per_pixel <= 16) {
1277 if (v.bits_per_pixel == 16) 1249 if (v.bits_per_pixel == 16)
1278 v.green.length = 6; 1250 v.green.length = 6;
1279 v.bits_per_pixel = 16; 1251 v.bits_per_pixel = 16;
1280 } else if (v.bits_per_pixel <= 32) { 1252 } else if (v.bits_per_pixel <= 32)
1281 v.bits_per_pixel = 32; 1253 v.bits_per_pixel = 32;
1282 } else 1254 else
1283 return -EINVAL; 1255 return -EINVAL;
1284 1256
1285 change_var = ((info->var.xres != var->xres) || 1257 change_var = ((info->var.xres != var->xres) ||
@@ -1361,10 +1333,9 @@ intelfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
1361 return 0; 1333 return 0;
1362} 1334}
1363 1335
1364static int 1336static int intelfb_set_par(struct fb_info *info)
1365intelfb_set_par(struct fb_info *info)
1366{ 1337{
1367 struct intelfb_hwstate *hw; 1338 struct intelfb_hwstate *hw;
1368 struct intelfb_info *dinfo = GET_DINFO(info); 1339 struct intelfb_info *dinfo = GET_DINFO(info);
1369 1340
1370 if (FIXED_MODE(dinfo)) { 1341 if (FIXED_MODE(dinfo)) {
@@ -1372,9 +1343,9 @@ intelfb_set_par(struct fb_info *info)
1372 return -EINVAL; 1343 return -EINVAL;
1373 } 1344 }
1374 1345
1375 hw = kmalloc(sizeof(*hw), GFP_ATOMIC); 1346 hw = kmalloc(sizeof(*hw), GFP_ATOMIC);
1376 if (!hw) 1347 if (!hw)
1377 return -ENOMEM; 1348 return -ENOMEM;
1378 1349
1379 DBG_MSG("intelfb_set_par (%dx%d-%d)\n", info->var.xres, 1350 DBG_MSG("intelfb_set_par (%dx%d-%d)\n", info->var.xres,
1380 info->var.yres, info->var.bits_per_pixel); 1351 info->var.yres, info->var.bits_per_pixel);
@@ -1384,15 +1355,15 @@ intelfb_set_par(struct fb_info *info)
1384 if (ACCEL(dinfo, info)) 1355 if (ACCEL(dinfo, info))
1385 intelfbhw_2d_stop(dinfo); 1356 intelfbhw_2d_stop(dinfo);
1386 1357
1387 memcpy(hw, &dinfo->save_state, sizeof(*hw)); 1358 memcpy(hw, &dinfo->save_state, sizeof(*hw));
1388 if (intelfbhw_mode_to_hw(dinfo, hw, &info->var)) 1359 if (intelfbhw_mode_to_hw(dinfo, hw, &info->var))
1389 goto invalid_mode; 1360 goto invalid_mode;
1390 if (intelfbhw_program_mode(dinfo, hw, 0)) 1361 if (intelfbhw_program_mode(dinfo, hw, 0))
1391 goto invalid_mode; 1362 goto invalid_mode;
1392 1363
1393#if REGDUMP > 0 1364#if REGDUMP > 0
1394 intelfbhw_read_hw_state(dinfo, hw, 0); 1365 intelfbhw_read_hw_state(dinfo, hw, 0);
1395 intelfbhw_print_hw_state(dinfo, hw); 1366 intelfbhw_print_hw_state(dinfo, hw);
1396#endif 1367#endif
1397 1368
1398 update_dinfo(dinfo, &info->var); 1369 update_dinfo(dinfo, &info->var);
@@ -1408,9 +1379,9 @@ intelfb_set_par(struct fb_info *info)
1408 info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN | 1379 info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN |
1409 FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT | 1380 FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT |
1410 FBINFO_HWACCEL_IMAGEBLIT; 1381 FBINFO_HWACCEL_IMAGEBLIT;
1411 } else { 1382 } else
1412 info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; 1383 info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;
1413 } 1384
1414 kfree(hw); 1385 kfree(hw);
1415 return 0; 1386 return 0;
1416invalid_mode: 1387invalid_mode:
@@ -1418,9 +1389,9 @@ invalid_mode:
1418 return -EINVAL; 1389 return -EINVAL;
1419} 1390}
1420 1391
1421static int 1392static int intelfb_setcolreg(unsigned regno, unsigned red, unsigned green,
1422intelfb_setcolreg(unsigned regno, unsigned red, unsigned green, 1393 unsigned blue, unsigned transp,
1423 unsigned blue, unsigned transp, struct fb_info *info) 1394 struct fb_info *info)
1424{ 1395{
1425 struct intelfb_info *dinfo = GET_DINFO(info); 1396 struct intelfb_info *dinfo = GET_DINFO(info);
1426 1397
@@ -1463,23 +1434,22 @@ intelfb_setcolreg(unsigned regno, unsigned red, unsigned green,
1463 return 0; 1434 return 0;
1464} 1435}
1465 1436
1466static int 1437static int intelfb_blank(int blank, struct fb_info *info)
1467intelfb_blank(int blank, struct fb_info *info)
1468{ 1438{
1469 intelfbhw_do_blank(blank, info); 1439 intelfbhw_do_blank(blank, info);
1470 return 0; 1440 return 0;
1471} 1441}
1472 1442
1473static int 1443static int intelfb_pan_display(struct fb_var_screeninfo *var,
1474intelfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) 1444 struct fb_info *info)
1475{ 1445{
1476 intelfbhw_pan_display(var, info); 1446 intelfbhw_pan_display(var, info);
1477 return 0; 1447 return 0;
1478} 1448}
1479 1449
1480/* When/if we have our own ioctls. */ 1450/* When/if we have our own ioctls. */
1481static int 1451static int intelfb_ioctl(struct fb_info *info, unsigned int cmd,
1482intelfb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) 1452 unsigned long arg)
1483{ 1453{
1484 int retval = 0; 1454 int retval = 0;
1485 struct intelfb_info *dinfo = GET_DINFO(info); 1455 struct intelfb_info *dinfo = GET_DINFO(info);
@@ -1499,8 +1469,8 @@ intelfb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
1499 return retval; 1469 return retval;
1500} 1470}
1501 1471
1502static void 1472static void intelfb_fillrect (struct fb_info *info,
1503intelfb_fillrect (struct fb_info *info, const struct fb_fillrect *rect) 1473 const struct fb_fillrect *rect)
1504{ 1474{
1505 struct intelfb_info *dinfo = GET_DINFO(info); 1475 struct intelfb_info *dinfo = GET_DINFO(info);
1506 u32 rop, color; 1476 u32 rop, color;
@@ -1514,7 +1484,7 @@ intelfb_fillrect (struct fb_info *info, const struct fb_fillrect *rect)
1514 1484
1515 if (rect->rop == ROP_COPY) 1485 if (rect->rop == ROP_COPY)
1516 rop = PAT_ROP_GXCOPY; 1486 rop = PAT_ROP_GXCOPY;
1517 else // ROP_XOR 1487 else /* ROP_XOR */
1518 rop = PAT_ROP_GXXOR; 1488 rop = PAT_ROP_GXXOR;
1519 1489
1520 if (dinfo->depth != 8) 1490 if (dinfo->depth != 8)
@@ -1528,8 +1498,8 @@ intelfb_fillrect (struct fb_info *info, const struct fb_fillrect *rect)
1528 rop); 1498 rop);
1529} 1499}
1530 1500
1531static void 1501static void intelfb_copyarea(struct fb_info *info,
1532intelfb_copyarea(struct fb_info *info, const struct fb_copyarea *region) 1502 const struct fb_copyarea *region)
1533{ 1503{
1534 struct intelfb_info *dinfo = GET_DINFO(info); 1504 struct intelfb_info *dinfo = GET_DINFO(info);
1535 1505
@@ -1545,8 +1515,8 @@ intelfb_copyarea(struct fb_info *info, const struct fb_copyarea *region)
1545 dinfo->pitch, info->var.bits_per_pixel); 1515 dinfo->pitch, info->var.bits_per_pixel);
1546} 1516}
1547 1517
1548static void 1518static void intelfb_imageblit(struct fb_info *info,
1549intelfb_imageblit(struct fb_info *info, const struct fb_image *image) 1519 const struct fb_image *image)
1550{ 1520{
1551 struct intelfb_info *dinfo = GET_DINFO(info); 1521 struct intelfb_info *dinfo = GET_DINFO(info);
1552 u32 fgcolor, bgcolor; 1522 u32 fgcolor, bgcolor;
@@ -1574,8 +1544,7 @@ intelfb_imageblit(struct fb_info *info, const struct fb_image *image)
1574 return cfb_imageblit(info, image); 1544 return cfb_imageblit(info, image);
1575} 1545}
1576 1546
1577static int 1547static int intelfb_cursor(struct fb_info *info, struct fb_cursor *cursor)
1578intelfb_cursor(struct fb_info *info, struct fb_cursor *cursor)
1579{ 1548{
1580 struct intelfb_info *dinfo = GET_DINFO(info); 1549 struct intelfb_info *dinfo = GET_DINFO(info);
1581 u32 physical; 1550 u32 physical;
@@ -1689,8 +1658,7 @@ intelfb_cursor(struct fb_info *info, struct fb_cursor *cursor)
1689 return 0; 1658 return 0;
1690} 1659}
1691 1660
1692static int 1661static int intelfb_sync(struct fb_info *info)
1693intelfb_sync(struct fb_info *info)
1694{ 1662{
1695 struct intelfb_info *dinfo = GET_DINFO(info); 1663 struct intelfb_info *dinfo = GET_DINFO(info);
1696 1664
diff --git a/drivers/video/intelfb/intelfbhw.c b/drivers/video/intelfb/intelfbhw.c
index 04d0e0fd9bc0..fe38df8e2b6f 100644
--- a/drivers/video/intelfb/intelfbhw.c
+++ b/drivers/video/intelfb/intelfbhw.c
@@ -56,17 +56,16 @@ static struct pll_min_max plls[PLLS_MAX] = {
56 6, 16, 3, 16, 56 6, 16, 3, 16,
57 4, 128, 0, 31, 57 4, 128, 0, 31,
58 930000, 1400000, 165000, 48000, 58 930000, 1400000, 165000, 48000,
59 4, 2 }, //I8xx 59 4, 2 }, /* I8xx */
60 60
61 { 75, 120, 10, 20, 61 { 75, 120, 10, 20,
62 5, 9, 4, 7, 62 5, 9, 4, 7,
63 5, 80, 1, 8, 63 5, 80, 1, 8,
64 1400000, 2800000, 200000, 96000, 64 1400000, 2800000, 200000, 96000,
65 10, 5 } //I9xx 65 10, 5 } /* I9xx */
66}; 66};
67 67
68int 68int intelfbhw_get_chipset(struct pci_dev *pdev, struct intelfb_info *dinfo)
69intelfbhw_get_chipset(struct pci_dev *pdev, struct intelfb_info *dinfo)
70{ 69{
71 u32 tmp; 70 u32 tmp;
72 if (!pdev || !dinfo) 71 if (!pdev || !dinfo)
@@ -149,9 +148,8 @@ intelfbhw_get_chipset(struct pci_dev *pdev, struct intelfb_info *dinfo)
149 } 148 }
150} 149}
151 150
152int 151int intelfbhw_get_memory(struct pci_dev *pdev, int *aperture_size,
153intelfbhw_get_memory(struct pci_dev *pdev, int *aperture_size, 152 int *stolen_size)
154 int *stolen_size)
155{ 153{
156 struct pci_dev *bridge_dev; 154 struct pci_dev *bridge_dev;
157 u16 tmp; 155 u16 tmp;
@@ -254,8 +252,7 @@ intelfbhw_get_memory(struct pci_dev *pdev, int *aperture_size,
254 } 252 }
255} 253}
256 254
257int 255int intelfbhw_check_non_crt(struct intelfb_info *dinfo)
258intelfbhw_check_non_crt(struct intelfb_info *dinfo)
259{ 256{
260 int dvo = 0; 257 int dvo = 0;
261 258
@@ -271,8 +268,7 @@ intelfbhw_check_non_crt(struct intelfb_info *dinfo)
271 return dvo; 268 return dvo;
272} 269}
273 270
274const char * 271const char * intelfbhw_dvo_to_string(int dvo)
275intelfbhw_dvo_to_string(int dvo)
276{ 272{
277 if (dvo & DVOA_PORT) 273 if (dvo & DVOA_PORT)
278 return "DVO port A"; 274 return "DVO port A";
@@ -287,9 +283,8 @@ intelfbhw_dvo_to_string(int dvo)
287} 283}
288 284
289 285
290int 286int intelfbhw_validate_mode(struct intelfb_info *dinfo,
291intelfbhw_validate_mode(struct intelfb_info *dinfo, 287 struct fb_var_screeninfo *var)
292 struct fb_var_screeninfo *var)
293{ 288{
294 int bytes_per_pixel; 289 int bytes_per_pixel;
295 int tmp; 290 int tmp;
@@ -345,8 +340,7 @@ intelfbhw_validate_mode(struct intelfb_info *dinfo,
345 return 0; 340 return 0;
346} 341}
347 342
348int 343int intelfbhw_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
349intelfbhw_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
350{ 344{
351 struct intelfb_info *dinfo = GET_DINFO(info); 345 struct intelfb_info *dinfo = GET_DINFO(info);
352 u32 offset, xoffset, yoffset; 346 u32 offset, xoffset, yoffset;
@@ -368,9 +362,10 @@ intelfbhw_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
368 offset += dinfo->fb.offset << 12; 362 offset += dinfo->fb.offset << 12;
369 363
370 dinfo->vsync.pan_offset = offset; 364 dinfo->vsync.pan_offset = offset;
371 if ((var->activate & FB_ACTIVATE_VBL) && !intelfbhw_enable_irq(dinfo, 0)) { 365 if ((var->activate & FB_ACTIVATE_VBL) &&
366 !intelfbhw_enable_irq(dinfo, 0))
372 dinfo->vsync.pan_display = 1; 367 dinfo->vsync.pan_display = 1;
373 } else { 368 else {
374 dinfo->vsync.pan_display = 0; 369 dinfo->vsync.pan_display = 0;
375 OUTREG(DSPABASE, offset); 370 OUTREG(DSPABASE, offset);
376 } 371 }
@@ -379,8 +374,7 @@ intelfbhw_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
379} 374}
380 375
381/* Blank the screen. */ 376/* Blank the screen. */
382void 377void intelfbhw_do_blank(int blank, struct fb_info *info)
383intelfbhw_do_blank(int blank, struct fb_info *info)
384{ 378{
385 struct intelfb_info *dinfo = GET_DINFO(info); 379 struct intelfb_info *dinfo = GET_DINFO(info);
386 u32 tmp; 380 u32 tmp;
@@ -405,11 +399,10 @@ intelfbhw_do_blank(int blank, struct fb_info *info)
405 DBG_MSG("cursor_on is %d\n", dinfo->cursor_on); 399 DBG_MSG("cursor_on is %d\n", dinfo->cursor_on);
406#endif 400#endif
407 if (dinfo->cursor_on) { 401 if (dinfo->cursor_on) {
408 if (blank) { 402 if (blank)
409 intelfbhw_cursor_hide(dinfo); 403 intelfbhw_cursor_hide(dinfo);
410 } else { 404 else
411 intelfbhw_cursor_show(dinfo); 405 intelfbhw_cursor_show(dinfo);
412 }
413 dinfo->cursor_on = 1; 406 dinfo->cursor_on = 1;
414 } 407 }
415 dinfo->cursor_blanked = blank; 408 dinfo->cursor_blanked = blank;
@@ -437,10 +430,9 @@ intelfbhw_do_blank(int blank, struct fb_info *info)
437} 430}
438 431
439 432
440void 433void intelfbhw_setcolreg(struct intelfb_info *dinfo, unsigned regno,
441intelfbhw_setcolreg(struct intelfb_info *dinfo, unsigned regno, 434 unsigned red, unsigned green, unsigned blue,
442 unsigned red, unsigned green, unsigned blue, 435 unsigned transp)
443 unsigned transp)
444{ 436{
445#if VERBOSE > 0 437#if VERBOSE > 0
446 DBG_MSG("intelfbhw_setcolreg: %d: (%d, %d, %d)\n", 438 DBG_MSG("intelfbhw_setcolreg: %d: (%d, %d, %d)\n",
@@ -457,9 +449,8 @@ intelfbhw_setcolreg(struct intelfb_info *dinfo, unsigned regno,
457} 449}
458 450
459 451
460int 452int intelfbhw_read_hw_state(struct intelfb_info *dinfo,
461intelfbhw_read_hw_state(struct intelfb_info *dinfo, struct intelfb_hwstate *hw, 453 struct intelfb_hwstate *hw, int flag)
462 int flag)
463{ 454{
464 int i; 455 int i;
465 456
@@ -606,7 +597,8 @@ static int calc_vclock3(int index, int m, int n, int p)
606 return plls[index].ref_clk * m / n / p; 597 return plls[index].ref_clk * m / n / p;
607} 598}
608 599
609static int calc_vclock(int index, int m1, int m2, int n, int p1, int p2, int lvds) 600static int calc_vclock(int index, int m1, int m2, int n, int p1, int p2,
601 int lvds)
610{ 602{
611 struct pll_min_max *pll = &plls[index]; 603 struct pll_min_max *pll = &plls[index];
612 u32 m, vco, p; 604 u32 m, vco, p;
@@ -615,17 +607,16 @@ static int calc_vclock(int index, int m1, int m2, int n, int p1, int p2, int lvd
615 n += 2; 607 n += 2;
616 vco = pll->ref_clk * m / n; 608 vco = pll->ref_clk * m / n;
617 609
618 if (index == PLLS_I8xx) { 610 if (index == PLLS_I8xx)
619 p = ((p1 + 2) * (1 << (p2 + 1))); 611 p = ((p1 + 2) * (1 << (p2 + 1)));
620 } else { 612 else
621 p = ((p1) * (p2 ? 5 : 10)); 613 p = ((p1) * (p2 ? 5 : 10));
622 }
623 return vco / p; 614 return vco / p;
624} 615}
625 616
626#if REGDUMP 617#if REGDUMP
627static void 618static void intelfbhw_get_p1p2(struct intelfb_info *dinfo, int dpll,
628intelfbhw_get_p1p2(struct intelfb_info *dinfo, int dpll, int *o_p1, int *o_p2) 619 int *o_p1, int *o_p2)
629{ 620{
630 int p1, p2; 621 int p1, p2;
631 622
@@ -634,7 +625,7 @@ intelfbhw_get_p1p2(struct intelfb_info *dinfo, int dpll, int *o_p1, int *o_p2)
634 p1 = 1; 625 p1 = 1;
635 else 626 else
636 p1 = (dpll >> DPLL_P1_SHIFT) & 0xff; 627 p1 = (dpll >> DPLL_P1_SHIFT) & 0xff;
637 628
638 p1 = ffs(p1); 629 p1 = ffs(p1);
639 630
640 p2 = (dpll >> DPLL_I9XX_P2_SHIFT) & DPLL_P2_MASK; 631 p2 = (dpll >> DPLL_I9XX_P2_SHIFT) & DPLL_P2_MASK;
@@ -652,8 +643,8 @@ intelfbhw_get_p1p2(struct intelfb_info *dinfo, int dpll, int *o_p1, int *o_p2)
652#endif 643#endif
653 644
654 645
655void 646void intelfbhw_print_hw_state(struct intelfb_info *dinfo,
656intelfbhw_print_hw_state(struct intelfb_info *dinfo, struct intelfb_hwstate *hw) 647 struct intelfb_hwstate *hw)
657{ 648{
658#if REGDUMP 649#if REGDUMP
659 int i, m1, m2, n, p1, p2; 650 int i, m1, m2, n, p1, p2;
@@ -666,7 +657,7 @@ intelfbhw_print_hw_state(struct intelfb_info *dinfo, struct intelfb_hwstate *hw)
666 printk("hw state dump start\n"); 657 printk("hw state dump start\n");
667 printk(" VGA0_DIVISOR: 0x%08x\n", hw->vga0_divisor); 658 printk(" VGA0_DIVISOR: 0x%08x\n", hw->vga0_divisor);
668 printk(" VGA1_DIVISOR: 0x%08x\n", hw->vga1_divisor); 659 printk(" VGA1_DIVISOR: 0x%08x\n", hw->vga1_divisor);
669 printk(" VGAPD: 0x%08x\n", hw->vga_pd); 660 printk(" VGAPD: 0x%08x\n", hw->vga_pd);
670 n = (hw->vga0_divisor >> FP_N_DIVISOR_SHIFT) & FP_DIVISOR_MASK; 661 n = (hw->vga0_divisor >> FP_N_DIVISOR_SHIFT) & FP_DIVISOR_MASK;
671 m1 = (hw->vga0_divisor >> FP_M1_DIVISOR_SHIFT) & FP_DIVISOR_MASK; 662 m1 = (hw->vga0_divisor >> FP_M1_DIVISOR_SHIFT) & FP_DIVISOR_MASK;
672 m2 = (hw->vga0_divisor >> FP_M2_DIVISOR_SHIFT) & FP_DIVISOR_MASK; 663 m2 = (hw->vga0_divisor >> FP_M2_DIVISOR_SHIFT) & FP_DIVISOR_MASK;
@@ -685,7 +676,8 @@ intelfbhw_print_hw_state(struct intelfb_info *dinfo, struct intelfb_hwstate *hw)
685 intelfbhw_get_p1p2(dinfo, hw->vga_pd, &p1, &p2); 676 intelfbhw_get_p1p2(dinfo, hw->vga_pd, &p1, &p2);
686 printk(" VGA1: (m1, m2, n, p1, p2) = (%d, %d, %d, %d, %d)\n", 677 printk(" VGA1: (m1, m2, n, p1, p2) = (%d, %d, %d, %d, %d)\n",
687 m1, m2, n, p1, p2); 678 m1, m2, n, p1, p2);
688 printk(" VGA1: clock is %d\n", calc_vclock(index, m1, m2, n, p1, p2, 0)); 679 printk(" VGA1: clock is %d\n",
680 calc_vclock(index, m1, m2, n, p1, p2, 0));
689 681
690 printk(" DPLL_A: 0x%08x\n", hw->dpll_a); 682 printk(" DPLL_A: 0x%08x\n", hw->dpll_a);
691 printk(" DPLL_B: 0x%08x\n", hw->dpll_b); 683 printk(" DPLL_B: 0x%08x\n", hw->dpll_b);
@@ -702,7 +694,8 @@ intelfbhw_print_hw_state(struct intelfb_info *dinfo, struct intelfb_hwstate *hw)
702 694
703 printk(" PLLA0: (m1, m2, n, p1, p2) = (%d, %d, %d, %d, %d)\n", 695 printk(" PLLA0: (m1, m2, n, p1, p2) = (%d, %d, %d, %d, %d)\n",
704 m1, m2, n, p1, p2); 696 m1, m2, n, p1, p2);
705 printk(" PLLA0: clock is %d\n", calc_vclock(index, m1, m2, n, p1, p2, 0)); 697 printk(" PLLA0: clock is %d\n",
698 calc_vclock(index, m1, m2, n, p1, p2, 0));
706 699
707 n = (hw->fpa1 >> FP_N_DIVISOR_SHIFT) & FP_DIVISOR_MASK; 700 n = (hw->fpa1 >> FP_N_DIVISOR_SHIFT) & FP_DIVISOR_MASK;
708 m1 = (hw->fpa1 >> FP_M1_DIVISOR_SHIFT) & FP_DIVISOR_MASK; 701 m1 = (hw->fpa1 >> FP_M1_DIVISOR_SHIFT) & FP_DIVISOR_MASK;
@@ -712,7 +705,8 @@ intelfbhw_print_hw_state(struct intelfb_info *dinfo, struct intelfb_hwstate *hw)
712 705
713 printk(" PLLA1: (m1, m2, n, p1, p2) = (%d, %d, %d, %d, %d)\n", 706 printk(" PLLA1: (m1, m2, n, p1, p2) = (%d, %d, %d, %d, %d)\n",
714 m1, m2, n, p1, p2); 707 m1, m2, n, p1, p2);
715 printk(" PLLA1: clock is %d\n", calc_vclock(index, m1, m2, n, p1, p2, 0)); 708 printk(" PLLA1: clock is %d\n",
709 calc_vclock(index, m1, m2, n, p1, p2, 0));
716 710
717#if 0 711#if 0
718 printk(" PALETTE_A:\n"); 712 printk(" PALETTE_A:\n");
@@ -817,8 +811,8 @@ intelfbhw_print_hw_state(struct intelfb_info *dinfo, struct intelfb_hwstate *hw)
817 811
818 812
819/* Split the M parameter into M1 and M2. */ 813/* Split the M parameter into M1 and M2. */
820static int 814static int splitm(int index, unsigned int m, unsigned int *retm1,
821splitm(int index, unsigned int m, unsigned int *retm1, unsigned int *retm2) 815 unsigned int *retm2)
822{ 816{
823 int m1, m2; 817 int m1, m2;
824 int testm; 818 int testm;
@@ -839,8 +833,8 @@ splitm(int index, unsigned int m, unsigned int *retm1, unsigned int *retm2)
839} 833}
840 834
841/* Split the P parameter into P1 and P2. */ 835/* Split the P parameter into P1 and P2. */
842static int 836static int splitp(int index, unsigned int p, unsigned int *retp1,
843splitp(int index, unsigned int p, unsigned int *retp1, unsigned int *retp2) 837 unsigned int *retp2)
844{ 838{
845 int p1, p2; 839 int p1, p2;
846 struct pll_min_max *pll = &plls[index]; 840 struct pll_min_max *pll = &plls[index];
@@ -874,9 +868,8 @@ splitp(int index, unsigned int p, unsigned int *retp1, unsigned int *retp2)
874 } 868 }
875} 869}
876 870
877static int 871static int calc_pll_params(int index, int clock, u32 *retm1, u32 *retm2,
878calc_pll_params(int index, int clock, u32 *retm1, u32 *retm2, u32 *retn, u32 *retp1, 872 u32 *retn, u32 *retp1, u32 *retp2, u32 *retclock)
879 u32 *retp2, u32 *retclock)
880{ 873{
881 u32 m1, m2, n, p1, p2, n1, testm; 874 u32 m1, m2, n, p1, p2, n1, testm;
882 u32 f_vco, p, p_best = 0, m, f_out = 0; 875 u32 f_vco, p, p_best = 0, m, f_out = 0;
@@ -971,8 +964,8 @@ calc_pll_params(int index, int clock, u32 *retm1, u32 *retm2, u32 *retn, u32 *re
971 return 0; 964 return 0;
972} 965}
973 966
974static __inline__ int 967static __inline__ int check_overflow(u32 value, u32 limit,
975check_overflow(u32 value, u32 limit, const char *description) 968 const char *description)
976{ 969{
977 if (value > limit) { 970 if (value > limit) {
978 WRN_MSG("%s value %d exceeds limit %d\n", 971 WRN_MSG("%s value %d exceeds limit %d\n",
@@ -983,9 +976,9 @@ check_overflow(u32 value, u32 limit, const char *description)
983} 976}
984 977
985/* It is assumed that hw is filled in with the initial state information. */ 978/* It is assumed that hw is filled in with the initial state information. */
986int 979int intelfbhw_mode_to_hw(struct intelfb_info *dinfo,
987intelfbhw_mode_to_hw(struct intelfb_info *dinfo, struct intelfb_hwstate *hw, 980 struct intelfb_hwstate *hw,
988 struct fb_var_screeninfo *var) 981 struct fb_var_screeninfo *var)
989{ 982{
990 int pipe = PIPE_A; 983 int pipe = PIPE_A;
991 u32 *dpll, *fp0, *fp1; 984 u32 *dpll, *fp0, *fp1;
@@ -1089,9 +1082,8 @@ intelfbhw_mode_to_hw(struct intelfb_info *dinfo, struct intelfb_hwstate *hw,
1089 if (IS_I9XX(dinfo)) { 1082 if (IS_I9XX(dinfo)) {
1090 *dpll |= (p2 << DPLL_I9XX_P2_SHIFT); 1083 *dpll |= (p2 << DPLL_I9XX_P2_SHIFT);
1091 *dpll |= (1 << (p1 - 1)) << DPLL_P1_SHIFT; 1084 *dpll |= (1 << (p1 - 1)) << DPLL_P1_SHIFT;
1092 } else { 1085 } else
1093 *dpll |= (p2 << DPLL_P2_SHIFT) | (p1 << DPLL_P1_SHIFT); 1086 *dpll |= (p2 << DPLL_P2_SHIFT) | (p1 << DPLL_P1_SHIFT);
1094 }
1095 1087
1096 *fp0 = (n << FP_N_DIVISOR_SHIFT) | 1088 *fp0 = (n << FP_N_DIVISOR_SHIFT) |
1097 (m1 << FP_M1_DIVISOR_SHIFT) | 1089 (m1 << FP_M1_DIVISOR_SHIFT) |
@@ -1226,9 +1218,8 @@ intelfbhw_mode_to_hw(struct intelfb_info *dinfo, struct intelfb_hwstate *hw,
1226} 1218}
1227 1219
1228/* Program a (non-VGA) video mode. */ 1220/* Program a (non-VGA) video mode. */
1229int 1221int intelfbhw_program_mode(struct intelfb_info *dinfo,
1230intelfbhw_program_mode(struct intelfb_info *dinfo, 1222 const struct intelfb_hwstate *hw, int blank)
1231 const struct intelfb_hwstate *hw, int blank)
1232{ 1223{
1233 int pipe = PIPE_A; 1224 int pipe = PIPE_A;
1234 u32 tmp; 1225 u32 tmp;
@@ -1324,7 +1315,7 @@ intelfbhw_program_mode(struct intelfb_info *dinfo,
1324 tmp &= ~PIPECONF_ENABLE; 1315 tmp &= ~PIPECONF_ENABLE;
1325 OUTREG(pipe_conf_reg, tmp); 1316 OUTREG(pipe_conf_reg, tmp);
1326 } 1317 }
1327 } while(count < 2000); 1318 } while (count < 2000);
1328 1319
1329 OUTREG(ADPA, INREG(ADPA) & ~ADPA_DAC_ENABLE); 1320 OUTREG(ADPA, INREG(ADPA) & ~ADPA_DAC_ENABLE);
1330 1321
@@ -1448,8 +1439,7 @@ static u32 get_ring_space(struct intelfb_info *dinfo)
1448 return ring_space; 1439 return ring_space;
1449} 1440}
1450 1441
1451static int 1442static int wait_ring(struct intelfb_info *dinfo, int n)
1452wait_ring(struct intelfb_info *dinfo, int n)
1453{ 1443{
1454 int i = 0; 1444 int i = 0;
1455 unsigned long end; 1445 unsigned long end;
@@ -1491,16 +1481,15 @@ wait_ring(struct intelfb_info *dinfo, int n)
1491 return i; 1481 return i;
1492} 1482}
1493 1483
1494static void 1484static void do_flush(struct intelfb_info *dinfo)
1495do_flush(struct intelfb_info *dinfo) { 1485{
1496 START_RING(2); 1486 START_RING(2);
1497 OUT_RING(MI_FLUSH | MI_WRITE_DIRTY_STATE | MI_INVALIDATE_MAP_CACHE); 1487 OUT_RING(MI_FLUSH | MI_WRITE_DIRTY_STATE | MI_INVALIDATE_MAP_CACHE);
1498 OUT_RING(MI_NOOP); 1488 OUT_RING(MI_NOOP);
1499 ADVANCE_RING(); 1489 ADVANCE_RING();
1500} 1490}
1501 1491
1502void 1492void intelfbhw_do_sync(struct intelfb_info *dinfo)
1503intelfbhw_do_sync(struct intelfb_info *dinfo)
1504{ 1493{
1505#if VERBOSE > 0 1494#if VERBOSE > 0
1506 DBG_MSG("intelfbhw_do_sync\n"); 1495 DBG_MSG("intelfbhw_do_sync\n");
@@ -1519,8 +1508,7 @@ intelfbhw_do_sync(struct intelfb_info *dinfo)
1519 dinfo->ring_space = dinfo->ring.size - RING_MIN_FREE; 1508 dinfo->ring_space = dinfo->ring.size - RING_MIN_FREE;
1520} 1509}
1521 1510
1522static void 1511static void refresh_ring(struct intelfb_info *dinfo)
1523refresh_ring(struct intelfb_info *dinfo)
1524{ 1512{
1525#if VERBOSE > 0 1513#if VERBOSE > 0
1526 DBG_MSG("refresh_ring\n"); 1514 DBG_MSG("refresh_ring\n");
@@ -1531,8 +1519,7 @@ refresh_ring(struct intelfb_info *dinfo)
1531 dinfo->ring_space = get_ring_space(dinfo); 1519 dinfo->ring_space = get_ring_space(dinfo);
1532} 1520}
1533 1521
1534static void 1522static void reset_state(struct intelfb_info *dinfo)
1535reset_state(struct intelfb_info *dinfo)
1536{ 1523{
1537 int i; 1524 int i;
1538 u32 tmp; 1525 u32 tmp;
@@ -1562,12 +1549,11 @@ reset_state(struct intelfb_info *dinfo)
1562} 1549}
1563 1550
1564/* Stop the 2D engine, and turn off the ring buffer. */ 1551/* Stop the 2D engine, and turn off the ring buffer. */
1565void 1552void intelfbhw_2d_stop(struct intelfb_info *dinfo)
1566intelfbhw_2d_stop(struct intelfb_info *dinfo)
1567{ 1553{
1568#if VERBOSE > 0 1554#if VERBOSE > 0
1569 DBG_MSG("intelfbhw_2d_stop: accel: %d, ring_active: %d\n", dinfo->accel, 1555 DBG_MSG("intelfbhw_2d_stop: accel: %d, ring_active: %d\n",
1570 dinfo->ring_active); 1556 dinfo->accel, dinfo->ring_active);
1571#endif 1557#endif
1572 1558
1573 if (!dinfo->accel) 1559 if (!dinfo->accel)
@@ -1582,8 +1568,7 @@ intelfbhw_2d_stop(struct intelfb_info *dinfo)
1582 * It is assumed that the graphics engine has been stopped by previously 1568 * It is assumed that the graphics engine has been stopped by previously
1583 * calling intelfb_2d_stop(). 1569 * calling intelfb_2d_stop().
1584 */ 1570 */
1585void 1571void intelfbhw_2d_start(struct intelfb_info *dinfo)
1586intelfbhw_2d_start(struct intelfb_info *dinfo)
1587{ 1572{
1588#if VERBOSE > 0 1573#if VERBOSE > 0
1589 DBG_MSG("intelfbhw_2d_start: accel: %d, ring_active: %d\n", 1574 DBG_MSG("intelfbhw_2d_start: accel: %d, ring_active: %d\n",
@@ -1607,9 +1592,8 @@ intelfbhw_2d_start(struct intelfb_info *dinfo)
1607} 1592}
1608 1593
1609/* 2D fillrect (solid fill or invert) */ 1594/* 2D fillrect (solid fill or invert) */
1610void 1595void intelfbhw_do_fillrect(struct intelfb_info *dinfo, u32 x, u32 y, u32 w,
1611intelfbhw_do_fillrect(struct intelfb_info *dinfo, u32 x, u32 y, u32 w, u32 h, 1596 u32 h, u32 color, u32 pitch, u32 bpp, u32 rop)
1612 u32 color, u32 pitch, u32 bpp, u32 rop)
1613{ 1597{
1614 u32 br00, br09, br13, br14, br16; 1598 u32 br00, br09, br13, br14, br16;
1615 1599
@@ -1698,9 +1682,9 @@ intelfbhw_do_bitblt(struct intelfb_info *dinfo, u32 curx, u32 cury,
1698 ADVANCE_RING(); 1682 ADVANCE_RING();
1699} 1683}
1700 1684
1701int 1685int intelfbhw_do_drawglyph(struct intelfb_info *dinfo, u32 fg, u32 bg, u32 w,
1702intelfbhw_do_drawglyph(struct intelfb_info *dinfo, u32 fg, u32 bg, u32 w, 1686 u32 h, const u8* cdat, u32 x, u32 y, u32 pitch,
1703 u32 h, const u8* cdat, u32 x, u32 y, u32 pitch, u32 bpp) 1687 u32 bpp)
1704{ 1688{
1705 int nbytes, ndwords, pad, tmp; 1689 int nbytes, ndwords, pad, tmp;
1706 u32 br00, br09, br13, br18, br19, br22, br23; 1690 u32 br00, br09, br13, br18, br19, br22, br23;
@@ -1787,8 +1771,7 @@ intelfbhw_do_drawglyph(struct intelfb_info *dinfo, u32 fg, u32 bg, u32 w,
1787} 1771}
1788 1772
1789/* HW cursor functions. */ 1773/* HW cursor functions. */
1790void 1774void intelfbhw_cursor_init(struct intelfb_info *dinfo)
1791intelfbhw_cursor_init(struct intelfb_info *dinfo)
1792{ 1775{
1793 u32 tmp; 1776 u32 tmp;
1794 1777
@@ -1819,8 +1802,7 @@ intelfbhw_cursor_init(struct intelfb_info *dinfo)
1819 } 1802 }
1820} 1803}
1821 1804
1822void 1805void intelfbhw_cursor_hide(struct intelfb_info *dinfo)
1823intelfbhw_cursor_hide(struct intelfb_info *dinfo)
1824{ 1806{
1825 u32 tmp; 1807 u32 tmp;
1826 1808
@@ -1845,8 +1827,7 @@ intelfbhw_cursor_hide(struct intelfb_info *dinfo)
1845 } 1827 }
1846} 1828}
1847 1829
1848void 1830void intelfbhw_cursor_show(struct intelfb_info *dinfo)
1849intelfbhw_cursor_show(struct intelfb_info *dinfo)
1850{ 1831{
1851 u32 tmp; 1832 u32 tmp;
1852 1833
@@ -1875,8 +1856,7 @@ intelfbhw_cursor_show(struct intelfb_info *dinfo)
1875 } 1856 }
1876} 1857}
1877 1858
1878void 1859void intelfbhw_cursor_setpos(struct intelfb_info *dinfo, int x, int y)
1879intelfbhw_cursor_setpos(struct intelfb_info *dinfo, int x, int y)
1880{ 1860{
1881 u32 tmp; 1861 u32 tmp;
1882 1862
@@ -1894,13 +1874,11 @@ intelfbhw_cursor_setpos(struct intelfb_info *dinfo, int x, int y)
1894 ((y & CURSOR_POS_MASK) << CURSOR_Y_SHIFT); 1874 ((y & CURSOR_POS_MASK) << CURSOR_Y_SHIFT);
1895 OUTREG(CURSOR_A_POSITION, tmp); 1875 OUTREG(CURSOR_A_POSITION, tmp);
1896 1876
1897 if (IS_I9XX(dinfo)) { 1877 if (IS_I9XX(dinfo))
1898 OUTREG(CURSOR_A_BASEADDR, dinfo->cursor.physical); 1878 OUTREG(CURSOR_A_BASEADDR, dinfo->cursor.physical);
1899 }
1900} 1879}
1901 1880
1902void 1881void intelfbhw_cursor_setcolor(struct intelfb_info *dinfo, u32 bg, u32 fg)
1903intelfbhw_cursor_setcolor(struct intelfb_info *dinfo, u32 bg, u32 fg)
1904{ 1882{
1905#if VERBOSE > 0 1883#if VERBOSE > 0
1906 DBG_MSG("intelfbhw_cursor_setcolor\n"); 1884 DBG_MSG("intelfbhw_cursor_setcolor\n");
@@ -1912,9 +1890,8 @@ intelfbhw_cursor_setcolor(struct intelfb_info *dinfo, u32 bg, u32 fg)
1912 OUTREG(CURSOR_A_PALETTE3, bg & CURSOR_PALETTE_MASK); 1890 OUTREG(CURSOR_A_PALETTE3, bg & CURSOR_PALETTE_MASK);
1913} 1891}
1914 1892
1915void 1893void intelfbhw_cursor_load(struct intelfb_info *dinfo, int width, int height,
1916intelfbhw_cursor_load(struct intelfb_info *dinfo, int width, int height, 1894 u8 *data)
1917 u8 *data)
1918{ 1895{
1919 u8 __iomem *addr = (u8 __iomem *)dinfo->cursor.virtual; 1896 u8 __iomem *addr = (u8 __iomem *)dinfo->cursor.virtual;
1920 int i, j, w = width / 8; 1897 int i, j, w = width / 8;
@@ -1942,8 +1919,8 @@ intelfbhw_cursor_load(struct intelfb_info *dinfo, int width, int height,
1942 } 1919 }
1943} 1920}
1944 1921
1945void 1922void intelfbhw_cursor_reset(struct intelfb_info *dinfo)
1946intelfbhw_cursor_reset(struct intelfb_info *dinfo) { 1923{
1947 u8 __iomem *addr = (u8 __iomem *)dinfo->cursor.virtual; 1924 u8 __iomem *addr = (u8 __iomem *)dinfo->cursor.virtual;
1948 int i, j; 1925 int i, j;
1949 1926
@@ -2047,8 +2024,8 @@ intelfbhw_disable_irq(struct intelfb_info *dinfo) {
2047 } 2024 }
2048} 2025}
2049 2026
2050int 2027int intelfbhw_wait_for_vsync(struct intelfb_info *dinfo, u32 pipe)
2051intelfbhw_wait_for_vsync(struct intelfb_info *dinfo, u32 pipe) { 2028{
2052 struct intelfb_vsync *vsync; 2029 struct intelfb_vsync *vsync;
2053 unsigned int count; 2030 unsigned int count;
2054 int ret; 2031 int ret;
@@ -2062,15 +2039,14 @@ intelfbhw_wait_for_vsync(struct intelfb_info *dinfo, u32 pipe) {
2062 } 2039 }
2063 2040
2064 ret = intelfbhw_enable_irq(dinfo, 0); 2041 ret = intelfbhw_enable_irq(dinfo, 0);
2065 if (ret) { 2042 if (ret)
2066 return ret; 2043 return ret;
2067 }
2068 2044
2069 count = vsync->count; 2045 count = vsync->count;
2070 ret = wait_event_interruptible_timeout(vsync->wait, count != vsync->count, HZ/10); 2046 ret = wait_event_interruptible_timeout(vsync->wait,
2071 if (ret < 0) { 2047 count != vsync->count, HZ / 10);
2048 if (ret < 0)
2072 return ret; 2049 return ret;
2073 }
2074 if (ret == 0) { 2050 if (ret == 0) {
2075 intelfbhw_enable_irq(dinfo, 1); 2051 intelfbhw_enable_irq(dinfo, 1);
2076 DBG_MSG("wait_for_vsync timed out!\n"); 2052 DBG_MSG("wait_for_vsync timed out!\n");
diff --git a/drivers/video/intelfb/intelfbhw.h b/drivers/video/intelfb/intelfbhw.h
index cfcd53749484..1a4df251b540 100644
--- a/drivers/video/intelfb/intelfbhw.h
+++ b/drivers/video/intelfb/intelfbhw.h
@@ -83,7 +83,7 @@
83 */ 83 */
84#define RING_MIN_FREE 64 84#define RING_MIN_FREE 64
85 85
86#define IPEHR 0x2088 86#define IPEHR 0x2088
87 87
88#define INSTDONE 0x2090 88#define INSTDONE 0x2090
89#define PRI_RING_EMPTY 1 89#define PRI_RING_EMPTY 1
@@ -128,9 +128,9 @@
128 128
129#define GPIOA 0x5010 129#define GPIOA 0x5010
130#define GPIOB 0x5014 130#define GPIOB 0x5014
131#define GPIOC 0x5018 // this may be external DDC on i830 131#define GPIOC 0x5018 /* this may be external DDC on i830 */
132#define GPIOD 0x501C // this is DVO DDC 132#define GPIOD 0x501C /* this is DVO DDC */
133#define GPIOE 0x5020 // this is DVO i2C 133#define GPIOE 0x5020 /* this is DVO i2C */
134#define GPIOF 0x5024 134#define GPIOF 0x5024
135 135
136/* PLL registers */ 136/* PLL registers */
@@ -269,8 +269,8 @@
269#define PORT_ENABLE (1 << 31) 269#define PORT_ENABLE (1 << 31)
270#define PORT_PIPE_SELECT_SHIFT 30 270#define PORT_PIPE_SELECT_SHIFT 30
271#define PORT_TV_FLAGS_MASK 0xFF 271#define PORT_TV_FLAGS_MASK 0xFF
272#define PORT_TV_FLAGS 0xC4 // ripped from my BIOS 272#define PORT_TV_FLAGS 0xC4 /* ripped from my BIOS
273 // to understand and correct 273 to understand and correct */
274 274
275#define DVOA_SRCDIM 0x61124 275#define DVOA_SRCDIM 0x61124
276#define DVOB_SRCDIM 0x61144 276#define DVOB_SRCDIM 0x61144
@@ -369,7 +369,7 @@
369#define DISPPLANE_8BPP (0x2<<26) 369#define DISPPLANE_8BPP (0x2<<26)
370#define DISPPLANE_15_16BPP (0x4<<26) 370#define DISPPLANE_15_16BPP (0x4<<26)
371#define DISPPLANE_16BPP (0x5<<26) 371#define DISPPLANE_16BPP (0x5<<26)
372#define DISPPLANE_32BPP_NO_ALPHA (0x6<<26) 372#define DISPPLANE_32BPP_NO_ALPHA (0x6<<26)
373#define DISPPLANE_32BPP (0x7<<26) 373#define DISPPLANE_32BPP (0x7<<26)
374#define DISPPLANE_STEREO_ENABLE (1<<25) 374#define DISPPLANE_STEREO_ENABLE (1<<25)
375#define DISPPLANE_STEREO_DISABLE 0 375#define DISPPLANE_STEREO_DISABLE 0