|
|
@@ -1463,6 +1463,43 @@ static u_long sm7xx_vram_probe(struct smtcfb_info *sfb)
|
|
|
return 0; /* unknown hardware */
|
|
|
}
|
|
|
|
|
|
+static void sm7xx_resolution_probe(struct smtcfb_info *sfb)
|
|
|
+{
|
|
|
+ /* get mode parameter from smtc_scr_info */
|
|
|
+ if (smtc_scr_info.lfb_width != 0) {
|
|
|
+ sfb->fb->var.xres = smtc_scr_info.lfb_width;
|
|
|
+ sfb->fb->var.yres = smtc_scr_info.lfb_height;
|
|
|
+ sfb->fb->var.bits_per_pixel = smtc_scr_info.lfb_depth;
|
|
|
+ goto final;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * No parameter, default resolution is 1024x768-16.
|
|
|
+ *
|
|
|
+ * FIXME: earlier laptops, such as IBM Thinkpad 240X, has a 800x600
|
|
|
+ * panel, also see the comments about Thinkpad 240X above.
|
|
|
+ */
|
|
|
+ sfb->fb->var.xres = SCREEN_X_RES;
|
|
|
+ sfb->fb->var.yres = SCREEN_Y_RES_PC;
|
|
|
+ sfb->fb->var.bits_per_pixel = SCREEN_BPP;
|
|
|
+
|
|
|
+#ifdef CONFIG_MIPS
|
|
|
+ /*
|
|
|
+ * Loongson MIPS netbooks use 1024x600 LCD panels, which is the original
|
|
|
+ * target platform of this driver, but nearly all old x86 laptops have
|
|
|
+ * 1024x768. Lighting 768 panels using 600's timings would partially
|
|
|
+ * garble the display, so we don't want that. But it's not possible to
|
|
|
+ * distinguish them reliably.
|
|
|
+ *
|
|
|
+ * So we change the default to 768, but keep 600 as-is on MIPS.
|
|
|
+ */
|
|
|
+ sfb->fb->var.yres = SCREEN_Y_RES_NETBOOK;
|
|
|
+#endif
|
|
|
+
|
|
|
+final:
|
|
|
+ big_pixel_depth(sfb->fb->var.bits_per_pixel, smtc_scr_info.lfb_depth);
|
|
|
+}
|
|
|
+
|
|
|
static int smtcfb_pci_probe(struct pci_dev *pdev,
|
|
|
const struct pci_device_id *ent)
|
|
|
{
|
|
|
@@ -1508,19 +1545,6 @@ static int smtcfb_pci_probe(struct pci_dev *pdev,
|
|
|
|
|
|
sm7xx_init_hw();
|
|
|
|
|
|
- /* get mode parameter from smtc_scr_info */
|
|
|
- if (smtc_scr_info.lfb_width != 0) {
|
|
|
- sfb->fb->var.xres = smtc_scr_info.lfb_width;
|
|
|
- sfb->fb->var.yres = smtc_scr_info.lfb_height;
|
|
|
- sfb->fb->var.bits_per_pixel = smtc_scr_info.lfb_depth;
|
|
|
- } else {
|
|
|
- /* default resolution 1024x600 16bit mode */
|
|
|
- sfb->fb->var.xres = SCREEN_X_RES;
|
|
|
- sfb->fb->var.yres = SCREEN_Y_RES;
|
|
|
- sfb->fb->var.bits_per_pixel = SCREEN_BPP;
|
|
|
- }
|
|
|
-
|
|
|
- big_pixel_depth(sfb->fb->var.bits_per_pixel, smtc_scr_info.lfb_depth);
|
|
|
/* Map address and memory detection */
|
|
|
mmio_base = pci_resource_start(pdev, 0);
|
|
|
pci_read_config_byte(pdev, PCI_REVISION_ID, &sfb->chip_rev_id);
|
|
|
@@ -1582,6 +1606,9 @@ static int smtcfb_pci_probe(struct pci_dev *pdev,
|
|
|
goto failed_fb;
|
|
|
}
|
|
|
|
|
|
+ /* probe and decide resolution */
|
|
|
+ sm7xx_resolution_probe(sfb);
|
|
|
+
|
|
|
/* can support 32 bpp */
|
|
|
if (sfb->fb->var.bits_per_pixel == 15)
|
|
|
sfb->fb->var.bits_per_pixel = 16;
|