aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/fsl-diu-fb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/fsl-diu-fb.c')
-rw-r--r--drivers/video/fsl-diu-fb.c105
1 files changed, 17 insertions, 88 deletions
diff --git a/drivers/video/fsl-diu-fb.c b/drivers/video/fsl-diu-fb.c
index dbb4cb7124dc..10ee411df3cf 100644
--- a/drivers/video/fsl-diu-fb.c
+++ b/drivers/video/fsl-diu-fb.c
@@ -322,14 +322,9 @@ static void *fsl_diu_alloc(size_t size, phys_addr_t *phys)
322{ 322{
323 void *virt; 323 void *virt;
324 324
325 pr_debug("size=%zu\n", size);
326
327 virt = alloc_pages_exact(size, GFP_DMA | __GFP_ZERO); 325 virt = alloc_pages_exact(size, GFP_DMA | __GFP_ZERO);
328 if (virt) { 326 if (virt)
329 *phys = virt_to_phys(virt); 327 *phys = virt_to_phys(virt);
330 pr_debug("virt=%p phys=%llx\n", virt,
331 (unsigned long long)*phys);
332 }
333 328
334 return virt; 329 return virt;
335} 330}
@@ -343,8 +338,6 @@ static void *fsl_diu_alloc(size_t size, phys_addr_t *phys)
343 */ 338 */
344static void fsl_diu_free(void *virt, size_t size) 339static void fsl_diu_free(void *virt, size_t size)
345{ 340{
346 pr_debug("virt=%p size=%zu\n", virt, size);
347
348 if (virt && size) 341 if (virt && size)
349 free_pages_exact(virt, size); 342 free_pages_exact(virt, size);
350} 343}
@@ -368,7 +361,6 @@ static int fsl_diu_enable_panel(struct fb_info *info)
368 struct fsl_diu_data *machine_data = mfbi->parent; 361 struct fsl_diu_data *machine_data = mfbi->parent;
369 int res = 0; 362 int res = 0;
370 363
371 pr_debug("enable_panel index %d\n", mfbi->index);
372 if (mfbi->type != MFB_TYPE_OFF) { 364 if (mfbi->type != MFB_TYPE_OFF) {
373 switch (mfbi->index) { 365 switch (mfbi->index) {
374 case 0: /* plane 0 */ 366 case 0: /* plane 0 */
@@ -585,9 +577,6 @@ static void adjust_aoi_size_position(struct fb_var_screeninfo *var,
585static int fsl_diu_check_var(struct fb_var_screeninfo *var, 577static int fsl_diu_check_var(struct fb_var_screeninfo *var,
586 struct fb_info *info) 578 struct fb_info *info)
587{ 579{
588 pr_debug("check_var xres: %d\n", var->xres);
589 pr_debug("check_var yres: %d\n", var->yres);
590
591 if (var->xres_virtual < var->xres) 580 if (var->xres_virtual < var->xres)
592 var->xres_virtual = var->xres; 581 var->xres_virtual = var->xres;
593 if (var->yres_virtual < var->yres) 582 if (var->yres_virtual < var->yres)
@@ -720,7 +709,6 @@ static void update_lcdc(struct fb_info *info)
720 709
721 diu_ops.set_gamma_table(machine_data->monitor_port, pool.gamma.vaddr); 710 diu_ops.set_gamma_table(machine_data->monitor_port, pool.gamma.vaddr);
722 711
723 pr_debug("update-lcdc: HW - %p\n Disabling DIU\n", hw);
724 disable_lcdc(info); 712 disable_lcdc(info);
725 713
726 /* Program DIU registers */ 714 /* Program DIU registers */
@@ -732,9 +720,6 @@ static void update_lcdc(struct fb_info *info)
732 out_be32(&hw->bgnd_wb, 0); /* BGND_WB */ 720 out_be32(&hw->bgnd_wb, 0); /* BGND_WB */
733 out_be32(&hw->disp_size, (var->yres << 16 | var->xres)); 721 out_be32(&hw->disp_size, (var->yres << 16 | var->xres));
734 /* DISP SIZE */ 722 /* DISP SIZE */
735 pr_debug("DIU xres: %d\n", var->xres);
736 pr_debug("DIU yres: %d\n", var->yres);
737
738 out_be32(&hw->wb_size, 0); /* WB SIZE */ 723 out_be32(&hw->wb_size, 0); /* WB SIZE */
739 out_be32(&hw->wb_mem_addr, 0); /* WB MEM ADDR */ 724 out_be32(&hw->wb_mem_addr, 0); /* WB MEM ADDR */
740 725
@@ -751,15 +736,6 @@ static void update_lcdc(struct fb_info *info)
751 736
752 out_be32(&hw->vsyn_para, temp); 737 out_be32(&hw->vsyn_para, temp);
753 738
754 pr_debug("DIU right_margin - %d\n", var->right_margin);
755 pr_debug("DIU left_margin - %d\n", var->left_margin);
756 pr_debug("DIU hsync_len - %d\n", var->hsync_len);
757 pr_debug("DIU upper_margin - %d\n", var->upper_margin);
758 pr_debug("DIU lower_margin - %d\n", var->lower_margin);
759 pr_debug("DIU vsync_len - %d\n", var->vsync_len);
760 pr_debug("DIU HSYNC - 0x%08x\n", hw->hsyn_para);
761 pr_debug("DIU VSYNC - 0x%08x\n", hw->vsyn_para);
762
763 diu_ops.set_pixel_clock(var->pixclock); 739 diu_ops.set_pixel_clock(var->pixclock);
764 740
765 out_be32(&hw->syn_pol, 0); /* SYNC SIGNALS POLARITY */ 741 out_be32(&hw->syn_pol, 0); /* SYNC SIGNALS POLARITY */
@@ -776,14 +752,9 @@ static int map_video_memory(struct fb_info *info)
776 phys_addr_t phys; 752 phys_addr_t phys;
777 u32 smem_len = info->fix.line_length * info->var.yres_virtual; 753 u32 smem_len = info->fix.line_length * info->var.yres_virtual;
778 754
779 pr_debug("info->var.xres_virtual = %d\n", info->var.xres_virtual);
780 pr_debug("info->var.yres_virtual = %d\n", info->var.yres_virtual);
781 pr_debug("info->fix.line_length = %d\n", info->fix.line_length);
782 pr_debug("MAP_VIDEO_MEMORY: smem_len = %u\n", smem_len);
783
784 info->screen_base = fsl_diu_alloc(smem_len, &phys); 755 info->screen_base = fsl_diu_alloc(smem_len, &phys);
785 if (info->screen_base == NULL) { 756 if (info->screen_base == NULL) {
786 printk(KERN_ERR "Unable to allocate fb memory\n"); 757 dev_err(info->dev, "unable to allocate fb memory\n");
787 return -ENOMEM; 758 return -ENOMEM;
788 } 759 }
789 mutex_lock(&info->mm_lock); 760 mutex_lock(&info->mm_lock);
@@ -792,10 +763,6 @@ static int map_video_memory(struct fb_info *info)
792 mutex_unlock(&info->mm_lock); 763 mutex_unlock(&info->mm_lock);
793 info->screen_size = info->fix.smem_len; 764 info->screen_size = info->fix.smem_len;
794 765
795 pr_debug("Allocated fb @ paddr=0x%08lx, size=%d.\n",
796 info->fix.smem_start, info->fix.smem_len);
797 pr_debug("screen base %p\n", info->screen_base);
798
799 return 0; 766 return 0;
800} 767}
801 768
@@ -852,11 +819,10 @@ static int fsl_diu_set_par(struct fb_info *info)
852 if (len != info->fix.smem_len) { 819 if (len != info->fix.smem_len) {
853 if (info->fix.smem_start) 820 if (info->fix.smem_start)
854 unmap_video_memory(info); 821 unmap_video_memory(info);
855 pr_debug("SET PAR: smem_len = %d\n", info->fix.smem_len);
856 822
857 /* Memory allocation for framebuffer */ 823 /* Memory allocation for framebuffer */
858 if (map_video_memory(info)) { 824 if (map_video_memory(info)) {
859 printk(KERN_ERR "Unable to allocate fb memory 1\n"); 825 dev_err(info->dev, "unable to allocate fb memory 1\n");
860 return -ENOMEM; 826 return -ENOMEM;
861 } 827 }
862 } 828 }
@@ -1023,21 +989,17 @@ static int fsl_diu_ioctl(struct fb_info *info, unsigned int cmd,
1023 if (copy_from_user(&pix_fmt, buf, sizeof(pix_fmt))) 989 if (copy_from_user(&pix_fmt, buf, sizeof(pix_fmt)))
1024 return -EFAULT; 990 return -EFAULT;
1025 ad->pix_fmt = pix_fmt; 991 ad->pix_fmt = pix_fmt;
1026 pr_debug("Set pixel format to 0x%08x\n", ad->pix_fmt);
1027 break; 992 break;
1028 case MFB_GET_PIXFMT: 993 case MFB_GET_PIXFMT:
1029 pix_fmt = ad->pix_fmt; 994 pix_fmt = ad->pix_fmt;
1030 if (copy_to_user(buf, &pix_fmt, sizeof(pix_fmt))) 995 if (copy_to_user(buf, &pix_fmt, sizeof(pix_fmt)))
1031 return -EFAULT; 996 return -EFAULT;
1032 pr_debug("get pixel format 0x%08x\n", ad->pix_fmt);
1033 break; 997 break;
1034 case MFB_SET_AOID: 998 case MFB_SET_AOID:
1035 if (copy_from_user(&aoi_d, buf, sizeof(aoi_d))) 999 if (copy_from_user(&aoi_d, buf, sizeof(aoi_d)))
1036 return -EFAULT; 1000 return -EFAULT;
1037 mfbi->x_aoi_d = aoi_d.x_aoi_d; 1001 mfbi->x_aoi_d = aoi_d.x_aoi_d;
1038 mfbi->y_aoi_d = aoi_d.y_aoi_d; 1002 mfbi->y_aoi_d = aoi_d.y_aoi_d;
1039 pr_debug("set AOI display offset of index %d to (%d,%d)\n",
1040 mfbi->index, aoi_d.x_aoi_d, aoi_d.y_aoi_d);
1041 fsl_diu_check_var(&info->var, info); 1003 fsl_diu_check_var(&info->var, info);
1042 fsl_diu_set_aoi(info); 1004 fsl_diu_set_aoi(info);
1043 break; 1005 break;
@@ -1046,14 +1008,11 @@ static int fsl_diu_ioctl(struct fb_info *info, unsigned int cmd,
1046 aoi_d.y_aoi_d = mfbi->y_aoi_d; 1008 aoi_d.y_aoi_d = mfbi->y_aoi_d;
1047 if (copy_to_user(buf, &aoi_d, sizeof(aoi_d))) 1009 if (copy_to_user(buf, &aoi_d, sizeof(aoi_d)))
1048 return -EFAULT; 1010 return -EFAULT;
1049 pr_debug("get AOI display offset of index %d (%d,%d)\n",
1050 mfbi->index, aoi_d.x_aoi_d, aoi_d.y_aoi_d);
1051 break; 1011 break;
1052 case MFB_GET_ALPHA: 1012 case MFB_GET_ALPHA:
1053 global_alpha = mfbi->g_alpha; 1013 global_alpha = mfbi->g_alpha;
1054 if (copy_to_user(buf, &global_alpha, sizeof(global_alpha))) 1014 if (copy_to_user(buf, &global_alpha, sizeof(global_alpha)))
1055 return -EFAULT; 1015 return -EFAULT;
1056 pr_debug("get global alpha of index %d\n", mfbi->index);
1057 break; 1016 break;
1058 case MFB_SET_ALPHA: 1017 case MFB_SET_ALPHA:
1059 /* set panel information */ 1018 /* set panel information */
@@ -1062,7 +1021,6 @@ static int fsl_diu_ioctl(struct fb_info *info, unsigned int cmd,
1062 ad->src_size_g_alpha = (ad->src_size_g_alpha & (~0xff)) | 1021 ad->src_size_g_alpha = (ad->src_size_g_alpha & (~0xff)) |
1063 (global_alpha & 0xff); 1022 (global_alpha & 0xff);
1064 mfbi->g_alpha = global_alpha; 1023 mfbi->g_alpha = global_alpha;
1065 pr_debug("set global alpha for index %d\n", mfbi->index);
1066 break; 1024 break;
1067 case MFB_SET_CHROMA_KEY: 1025 case MFB_SET_CHROMA_KEY:
1068 /* set panel winformation */ 1026 /* set panel winformation */
@@ -1090,7 +1048,6 @@ static int fsl_diu_ioctl(struct fb_info *info, unsigned int cmd,
1090 ad->ckmin_g = ck.green_min; 1048 ad->ckmin_g = ck.green_min;
1091 ad->ckmin_b = ck.blue_min; 1049 ad->ckmin_b = ck.blue_min;
1092 } 1050 }
1093 pr_debug("set chroma key\n");
1094 break; 1051 break;
1095 case FBIOGET_GWINFO: 1052 case FBIOGET_GWINFO:
1096 if (mfbi->type == MFB_TYPE_OFF) 1053 if (mfbi->type == MFB_TYPE_OFF)
@@ -1110,7 +1067,7 @@ static int fsl_diu_ioctl(struct fb_info *info, unsigned int cmd,
1110 break; 1067 break;
1111 1068
1112 default: 1069 default:
1113 printk(KERN_ERR "Unknown ioctl command (0x%08X)\n", cmd); 1070 dev_err(info->dev, "unknown ioctl command (0x%08X)\n", cmd);
1114 return -ENOIOCTLCMD; 1071 return -ENOIOCTLCMD;
1115 } 1072 }
1116 1073
@@ -1131,7 +1088,6 @@ static int fsl_diu_open(struct fb_info *info, int user)
1131 spin_lock(&diu_lock); 1088 spin_lock(&diu_lock);
1132 mfbi->count++; 1089 mfbi->count++;
1133 if (mfbi->count == 1) { 1090 if (mfbi->count == 1) {
1134 pr_debug("open plane index %d\n", mfbi->index);
1135 fsl_diu_check_var(&info->var, info); 1091 fsl_diu_check_var(&info->var, info);
1136 res = fsl_diu_set_par(info); 1092 res = fsl_diu_set_par(info);
1137 if (res < 0) 1093 if (res < 0)
@@ -1157,7 +1113,6 @@ static int fsl_diu_release(struct fb_info *info, int user)
1157 spin_lock(&diu_lock); 1113 spin_lock(&diu_lock);
1158 mfbi->count--; 1114 mfbi->count--;
1159 if (mfbi->count == 0) { 1115 if (mfbi->count == 0) {
1160 pr_debug("release plane index %d\n", mfbi->index);
1161 res = fsl_diu_disable_panel(info); 1116 res = fsl_diu_disable_panel(info);
1162 if (res < 0) 1117 if (res < 0)
1163 mfbi->count++; 1118 mfbi->count++;
@@ -1222,26 +1177,9 @@ static int __devinit install_fb(struct fb_info *info)
1222 } else { 1177 } else {
1223 aoi_mode = init_aoi_mode; 1178 aoi_mode = init_aoi_mode;
1224 } 1179 }
1225 pr_debug("mode used = %s\n", aoi_mode);
1226 rc = fb_find_mode(&info->var, info, aoi_mode, db, dbsize, 1180 rc = fb_find_mode(&info->var, info, aoi_mode, db, dbsize,
1227 &fsl_diu_default_mode, default_bpp); 1181 &fsl_diu_default_mode, default_bpp);
1228 switch (rc) { 1182 if (!rc) {
1229 case 1:
1230 pr_debug("using mode specified in @mode\n");
1231 break;
1232 case 2:
1233 pr_debug("using mode specified in @mode "
1234 "with ignored refresh rate\n");
1235 break;
1236 case 3:
1237 pr_debug("using mode default mode\n");
1238 break;
1239 case 4:
1240 pr_debug("using mode from list\n");
1241 break;
1242 default:
1243 pr_debug("rc = %d\n", rc);
1244 pr_debug("failed to find mode\n");
1245 /* 1183 /*
1246 * For plane 0 we continue and look into 1184 * For plane 0 we continue and look into
1247 * driver's internal modedb. 1185 * driver's internal modedb.
@@ -1250,7 +1188,6 @@ static int __devinit install_fb(struct fb_info *info)
1250 has_default_mode = 0; 1188 has_default_mode = 0;
1251 else 1189 else
1252 return -EINVAL; 1190 return -EINVAL;
1253 break;
1254 } 1191 }
1255 1192
1256 if (!has_default_mode) { 1193 if (!has_default_mode) {
@@ -1286,33 +1223,26 @@ static int __devinit install_fb(struct fb_info *info)
1286 fb_videomode_to_var(&info->var, modedb); 1223 fb_videomode_to_var(&info->var, modedb);
1287 } 1224 }
1288 1225
1289 pr_debug("xres_virtual %d\n", info->var.xres_virtual);
1290 pr_debug("bits_per_pixel %d\n", info->var.bits_per_pixel);
1291
1292 pr_debug("info->var.yres_virtual = %d\n", info->var.yres_virtual);
1293 pr_debug("info->fix.line_length = %d\n", info->fix.line_length);
1294
1295 if (mfbi->type == MFB_TYPE_OFF) 1226 if (mfbi->type == MFB_TYPE_OFF)
1296 mfbi->blank = FB_BLANK_NORMAL; 1227 mfbi->blank = FB_BLANK_NORMAL;
1297 else 1228 else
1298 mfbi->blank = FB_BLANK_UNBLANK; 1229 mfbi->blank = FB_BLANK_UNBLANK;
1299 1230
1300 if (fsl_diu_check_var(&info->var, info)) { 1231 if (fsl_diu_check_var(&info->var, info)) {
1301 printk(KERN_ERR "fb_check_var failed"); 1232 dev_err(info->dev, "fsl_diu_check_var failed\n");
1302 fb_dealloc_cmap(&info->cmap); 1233 fb_dealloc_cmap(&info->cmap);
1303 return -EINVAL; 1234 return -EINVAL;
1304 } 1235 }
1305 1236
1306 if (register_framebuffer(info) < 0) { 1237 if (register_framebuffer(info) < 0) {
1307 printk(KERN_ERR "register_framebuffer failed"); 1238 dev_err(info->dev, "register_framebuffer failed\n");
1308 unmap_video_memory(info); 1239 unmap_video_memory(info);
1309 fb_dealloc_cmap(&info->cmap); 1240 fb_dealloc_cmap(&info->cmap);
1310 return -EINVAL; 1241 return -EINVAL;
1311 } 1242 }
1312 1243
1313 mfbi->registered = 1; 1244 mfbi->registered = 1;
1314 printk(KERN_INFO "fb%d: %s fb device registered successfully.\n", 1245 dev_info(info->dev, "%s registered successfully\n", mfbi->id);
1315 info->node, info->fix.id);
1316 1246
1317 return 0; 1247 return 0;
1318} 1248}
@@ -1344,7 +1274,6 @@ static irqreturn_t fsl_diu_isr(int irq, void *dev_id)
1344 /* This is the workaround for underrun */ 1274 /* This is the workaround for underrun */
1345 if (status & INT_UNDRUN) { 1275 if (status & INT_UNDRUN) {
1346 out_be32(&hw->diu_mode, 0); 1276 out_be32(&hw->diu_mode, 0);
1347 pr_debug("Err: DIU occurs underrun!\n");
1348 udelay(1); 1277 udelay(1);
1349 out_be32(&hw->diu_mode, 1); 1278 out_be32(&hw->diu_mode, 1);
1350 } 1279 }
@@ -1376,9 +1305,7 @@ static int request_irq_local(int irq)
1376 status = in_be32(&hw->int_status); 1305 status = in_be32(&hw->int_status);
1377 1306
1378 ret = request_irq(irq, fsl_diu_isr, 0, "diu", NULL); 1307 ret = request_irq(irq, fsl_diu_isr, 0, "diu", NULL);
1379 if (ret) 1308 if (!ret) {
1380 pr_info("Request diu IRQ failed.\n");
1381 else {
1382 ints = INT_PARERR | INT_LS_BF_VS; 1309 ints = INT_PARERR | INT_LS_BF_VS;
1383#if !defined(CONFIG_NOT_COHERENT_CACHE) 1310#if !defined(CONFIG_NOT_COHERENT_CACHE)
1384 ints |= INT_VSYNC; 1311 ints |= INT_VSYNC;
@@ -1557,7 +1484,6 @@ static int __devinit fsl_diu_probe(struct platform_device *ofdev)
1557 dev_err(&ofdev->dev, "invalid DIU address\n"); 1484 dev_err(&ofdev->dev, "invalid DIU address\n");
1558 goto error; 1485 goto error;
1559 } 1486 }
1560 dev_dbg(&ofdev->dev, "%s, res.start: 0x%08x\n", __func__, res.start);
1561 1487
1562 dr.diu_reg = ioremap(res.start, sizeof(struct diu)); 1488 dr.diu_reg = ioremap(res.start, sizeof(struct diu));
1563 if (!dr.diu_reg) { 1489 if (!dr.diu_reg) {
@@ -1787,17 +1713,19 @@ static int __init fsl_diu_init(void)
1787#else 1713#else
1788 monitor_port = fsl_diu_name_to_port(monitor_string); 1714 monitor_port = fsl_diu_name_to_port(monitor_string);
1789#endif 1715#endif
1790 printk(KERN_INFO "Freescale DIU driver\n"); 1716 pr_info("Freescale Display Interface Unit (DIU) framebuffer driver\n");
1791 1717
1792#ifdef CONFIG_NOT_COHERENT_CACHE 1718#ifdef CONFIG_NOT_COHERENT_CACHE
1793 np = of_find_node_by_type(NULL, "cpu"); 1719 np = of_find_node_by_type(NULL, "cpu");
1794 if (!np) { 1720 if (!np) {
1795 printk(KERN_ERR "Err: can't find device node 'cpu'\n"); 1721 pr_err("fsl-diu-fb: can't find 'cpu' device node\n");
1796 return -ENODEV; 1722 return -ENODEV;
1797 } 1723 }
1798 1724
1799 prop = of_get_property(np, "d-cache-size", NULL); 1725 prop = of_get_property(np, "d-cache-size", NULL);
1800 if (prop == NULL) { 1726 if (prop == NULL) {
1727 pr_err("fsl-diu-fb: missing 'd-cache-size' property' "
1728 "in 'cpu' node\n");
1801 of_node_put(np); 1729 of_node_put(np);
1802 return -ENODEV; 1730 return -ENODEV;
1803 } 1731 }
@@ -1811,6 +1739,8 @@ static int __init fsl_diu_init(void)
1811 1739
1812 prop = of_get_property(np, "d-cache-line-size", NULL); 1740 prop = of_get_property(np, "d-cache-line-size", NULL);
1813 if (prop == NULL) { 1741 if (prop == NULL) {
1742 pr_err("fsl-diu-fb: missing 'd-cache-line-size' property' "
1743 "in 'cpu' node\n");
1814 of_node_put(np); 1744 of_node_put(np);
1815 return -ENODEV; 1745 return -ENODEV;
1816 } 1746 }
@@ -1824,8 +1754,7 @@ static int __init fsl_diu_init(void)
1824 1754
1825 ret = platform_driver_register(&fsl_diu_driver); 1755 ret = platform_driver_register(&fsl_diu_driver);
1826 if (ret) { 1756 if (ret) {
1827 printk(KERN_ERR 1757 pr_err("fsl-diu-fb: failed to register platform driver\n");
1828 "fsl-diu: failed to register platform driver\n");
1829#if defined(CONFIG_NOT_COHERENT_CACHE) 1758#if defined(CONFIG_NOT_COHERENT_CACHE)
1830 vfree(coherence_data); 1759 vfree(coherence_data);
1831#endif 1760#endif
@@ -1853,7 +1782,7 @@ module_param_named(mode, fb_mode, charp, 0);
1853MODULE_PARM_DESC(mode, 1782MODULE_PARM_DESC(mode,
1854 "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" "); 1783 "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" ");
1855module_param_named(bpp, default_bpp, ulong, 0); 1784module_param_named(bpp, default_bpp, ulong, 0);
1856MODULE_PARM_DESC(bpp, "Specify bit-per-pixel if not specified mode"); 1785MODULE_PARM_DESC(bpp, "Specify bit-per-pixel if not specified in 'mode'");
1857module_param_named(monitor, monitor_string, charp, 0); 1786module_param_named(monitor, monitor_string, charp, 0);
1858MODULE_PARM_DESC(monitor, "Specify the monitor port " 1787MODULE_PARM_DESC(monitor, "Specify the monitor port "
1859 "(\"dvi\", \"lvds\", or \"dlvds\") if supported by the platform"); 1788 "(\"dvi\", \"lvds\", or \"dlvds\") if supported by the platform");