| From 4ed7d2ccb7684510ec5f7a8f7ef534bc6a3d55b2 Mon Sep 17 00:00:00 2001 |
| From: Yifeng Li <tomli@tomli.me> |
| Date: Mon, 1 Apr 2019 17:46:59 +0200 |
| Subject: fbdev: sm712fb: use 1024x768 by default on non-MIPS, fix garbled display |
| |
| From: Yifeng Li <tomli@tomli.me> |
| |
| commit 4ed7d2ccb7684510ec5f7a8f7ef534bc6a3d55b2 upstream. |
| |
| 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. Since it's not possible to distinguish them reliably, |
| we change the default to 768, but keep 600 as-is on MIPS. |
| |
| Further, earlier laptops, such as IBM Thinkpad 240X, has a 800x600 LCD |
| panel, this driver would probably garbled those display. As we don't |
| have one for testing, the original behavior of the driver is kept as-is, |
| but the problem has been documented is the comments. |
| |
| Signed-off-by: Yifeng Li <tomli@tomli.me> |
| Tested-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com> |
| Cc: Teddy Wang <teddy.wang@siliconmotion.com> |
| Cc: <stable@vger.kernel.org> # v4.4+ |
| Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/video/fbdev/sm712.h | 7 +++-- |
| drivers/video/fbdev/sm712fb.c | 53 +++++++++++++++++++++++++++++++----------- |
| 2 files changed, 44 insertions(+), 16 deletions(-) |
| |
| --- a/drivers/video/fbdev/sm712.h |
| +++ b/drivers/video/fbdev/sm712.h |
| @@ -15,9 +15,10 @@ |
| |
| #define FB_ACCEL_SMI_LYNX 88 |
| |
| -#define SCREEN_X_RES 1024 |
| -#define SCREEN_Y_RES 600 |
| -#define SCREEN_BPP 16 |
| +#define SCREEN_X_RES 1024 |
| +#define SCREEN_Y_RES_PC 768 |
| +#define SCREEN_Y_RES_NETBOOK 600 |
| +#define SCREEN_BPP 16 |
| |
| #define dac_reg (0x3c8) |
| #define dac_val (0x3c9) |
| --- a/drivers/video/fbdev/sm712fb.c |
| +++ b/drivers/video/fbdev/sm712fb.c |
| @@ -1462,6 +1462,43 @@ static u_long sm7xx_vram_probe(struct sm |
| 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) |
| { |
| @@ -1507,19 +1544,6 @@ static int smtcfb_pci_probe(struct pci_d |
| |
| 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); |
| @@ -1581,6 +1605,9 @@ static int smtcfb_pci_probe(struct pci_d |
| goto failed_fb; |
| } |
| |
| + /* probe and decide resolution */ |
| + sm7xx_resolution_probe(sfb); |
| + |
| /* can support 32 bpp */ |
| if (15 == sfb->fb->var.bits_per_pixel) |
| sfb->fb->var.bits_per_pixel = 16; |